Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cross platform definition of 64 bit integers in C++ for Windows and Linux

I am trying to write cross-platform code in C++ for Windows(MinGW) and Linux(g++). I was used to define 64 bit integers in Linux as "long", but when I moved to MinGW, the sizeof(long) returned 4 bytes. Then I discovered that I can use "long long" or "__INT64" to define 64 bit integers in MinGW. I have two questions:

1.-What is the most portable way to define 64 bit integers for both Windows and Linux? I am currently using #ifdef, but I don't know if this is the best way to do it:

#ifdef LINUX
    #define INT64 long 
#elif WIN32
    #define INT64 long long
#endif

2.-Should I use "long long" or "__INT64" in MinGW? and why?

like image 822
Jaime Ivan Cervantes Avatar asked Apr 09 '13 17:04

Jaime Ivan Cervantes


Video Answer


2 Answers

You could use the type int64_t, which is defined in the header cstdint. This is standard as of C++11.

Note that this type might not exist if the platform you're using does not support 64 bit integers.

As for long long, that is another possibility. long longs are at least 64-bits wide. Note that it is standard as of C++11 as well, even though it will work on several compilers when using C++03.

As mentioned by Pete Becker, you could use int_least64_t. This is a good choice if you don't mind using exactly 64 bit integers, but some integral type that is at least 64 bits wide.

like image 63
mfontanini Avatar answered Sep 17 '22 16:09

mfontanini


I believe the question how to get a 64-bit integer was answered sufficiently, but I'll take a shot at the second one, whether to use "long long" or "__INT64". The question you need to answer first is what you need. If you need exactly 64 bits for some reason, by all means use something that gives you exactly those 64 bits, i.e. int64_t. Even if your platform/compiler doesn't have stdint.h, create your typedef as a suitable type as workaround (#ifdef'd for the compiler), because it makes your code more self-documenting. On the other hand, if you are handling e.g. the offsets in large memory segments (like e.g. a DVD image), use size_t or ssize_t, because those are typically the same size as a pointer, which is also self-documenting. Similarly, the offset in a file is best represented using fpos_t.

BTW: The assumption that "long" is 64 bits in Linux is wrong. In particular on 32-bit variants it is not 64 bits and I'm also not sure if really all 64-bit variants use 64-bit longs. These different systems are called ILP32, LP64 and LLP64. Search those terms on the web!

like image 29
Ulrich Eckhardt Avatar answered Sep 17 '22 16:09

Ulrich Eckhardt