Fixed-width integers in C++

馋奶兔 提交于 2019-11-28 09:44:30

Boost has the typedefs for all of the C99 types and more: "Boost integer library"

You can workaround the problem with some #ifdef directives.

#ifdef _MSC_VER
   typedef __int16 int16_t
#else
   #include <stdint.h>
#endif

Include the file <stdint.h> to get the definitions for types like uint16_t. VC++ doesn't come with <stdint.h> by default, but you can get that file from several places. Wikipedia lists a few, and Google will find you lots more.

Will the next C++ standard define fixed-width integers?

Yes.

As Mehrdad said, you can use #ifdefs for now. An alternative would be some elaborate template magic. Boost has got something in this direction, the Boost Integer library.

I've used a public domain (not GPL - true public domain) version of stdint.h by Danny Smith that's available in the mingw package:

I had to tweak that version to compile with some non VC 8 compilers (mostly VC6) - it has served me well.

Maybe one of these days I'll get around to posting my VC6-compatible version somewhere. The changes were pretty minor - just some macro trickery to use VC6 specific keywords for 64-bit types. If you don't need VC6 support, the mingw version should probably be all you need.

There are different paths to take. Most environments would hold that short ints are 16 bits, and long ints are 32. (The long is implied when you declare simply int.) If you typedef your own int16 type, you'll probably end up using a short int.

Another possibility lies with bit fields in structs. You can say something like:

struct x {
    int a : 16;
    int b : 5;
    ...
};

And so forth. If you then define:

struct x myvar;
myvar.a = 54;

You can be sure that myvar.a will hold 16 bits, and myvar.b will use 5; the total size of myvar rounding up for what all the bits comprise, plus of course the size of any other fields.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!