Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compliant way to parse a 64 bit integer using sscanf with GCC

I compiled the following c program with gcc -ansi -pedantic -Wall test.c:

#include <stdio.h>
#include <stdint.h>
#define  BUFFER 21
int main(int argc, char* argv[]) {
  uint64_t num = 0x1337C0DE;
  char str[BUFFER]; /* Safely Holds UINT64_MAX */
  if(argc > 1)
    sscanf(argv[1],"%llu",&num);
  sprintf(str,"%llu",num);
  return 0;
}

And I receive the following warnings:

test.c:8:5: warning: ISO C90 does not support the ‘ll’ gnu_scanf length modifier
test.c:9:3: warning: ISO C90 does not support the ‘ll’ gnu_printf length modifier

What is the correct, C90 standards compliant, way to a parse/print 64 bit integer from/to a string,
which doesn't generate these warnings?

like image 777
recursion.ninja Avatar asked Jul 04 '13 04:07

recursion.ninja


1 Answers

There is none. The largest integer type in C 90 is long, which is only guaranteed to be at least 32 bits. Since there's no integer type guaranteed to be at least 64 bits, there's also no way to read a 64-bit integer in C90 either. Of course, long could be 64 bits (it has been in at least one implementation, but there's no certainty that it is.

like image 162
Jerry Coffin Avatar answered Sep 20 '22 05:09

Jerry Coffin