在任何平台上声明始终为4字节的整数类型的最佳方法是什么?我不担心某些设备或旧机器有16位int。
- 在C语言中,一个字节不必是8位,因此32位和4位可能意味着不同的事情。
- @KTC:有没有不同定义字节的平台?
- 我也很想知道char在哪里!=8位字节!=8位。烧焦!=8bits似乎还可以,因为char==4位在我自己的未签名系统或一些旧系统中,但字节在哪里呢!=8位??
- wiki(en.wikipedia.org/wiki/byte)有很好的使用历史,以及byte所在的示例!=8位。它们现在比以前少了,但C标准谨慎地避免了这种假设。
- 在C(和C++)中,char==1字节。它不需要8比特。位的数目在中定义为char_位,必须至少为8。
- 我以前用过一台叫赛博的机器,它由CDC制造,有9位字节。但我想这些日子已经过去很久了。
- 相当多的DSP等具有16位字符(而C除了字符之外没有"字节"的概念——实际上它是最小的可寻址内存单元)。
- 作为存在证明,有一个表:insidedsp.com/articles/tabid/64/articletype/articleview/…
- 根据您所处的寻址模式,我们还有一个HoneyBoxen,它有6位和9位字节。
1 2 3
| #include <stdint.h>
int32_t my_32bit_int; |
- 只需注意,就标准而言,intn_t(和uintn_t)是可选的。当且仅当系统具有满足要求的类型时,才需要定义。
- 不过这正是你想要的。如果代码确实需要32位int,并且您试图在不支持它们的平台上编译它,那么您希望编译器返回给开发人员。把它换成其他尺寸再继续下去是可怕的。
- 注意,"EDOCX1"〔0〕头被明确记录为包括"EDOCX1"〔1〕(这对于C头来说并不常见),但是"EDOCX1"〔0〕头可能在"EDOCX1"〔1〕不是并且可能是可移植性的更好选择的情况下可用。""标题是标准委员会的一项发明,它的创建是为了使C的独立实现(与托管实现-普通实现相反)只需要支持"EDOCX1"(1),而不必支持"EDOCX1"(0)(它还意味着支持"EDOCX1"(7),否则这是不必要的)。
- 是否有方法将Int32_t定义为无符号?
- @马修赫布斯特,以东十一〔8〕。
- 我在我的代码中使用了这个32位的数字,打破了它,我使用了uint32_t而不是有效的。
C不太关心整数类型的确切大小,C99引入了头stdint.h,这可能是您最好的选择。包括这些,您可以使用,例如int32_t。当然,并非所有平台都支持这一点。
在我看来,科里的答案是"最佳"的,但是一个简单的"int"在实践中也会起作用(假设你忽略了16位int的系统)。在这一点上,如此多的代码依赖于32位的int,以至于系统供应商不会更改它。
(另请参见为什么long在许多64位系统上是32位的,以及为什么我们有"long long"。)
不过,使用Int32的好处之一是,您不会使这个问题长期存在!
- 不需要"忽略16位int的系统",long在任何地方都保证至少32位的宽度。
- 是的,但是使用"long"并不能处理初始请求,它正好是32位。例如,在64位Linux上(至少有些风格),long是64位——这在实际操作中可能会出现。
您需要包括inttypes.h而不是stdint.h,因为stdint.h在某些平台(如Solaris)上不可用,并且inttypes.h将包括stdint.h在Linux等系统上。如果您包含inttypes.h,那么您的代码在Linux和Solaris之间更易于移植。
这个链接解释了我的意思:关于inttypes.h的HP链接
这个链接有一个表,显示了如果您打算在您的数据类型中存在一定数量的位,为什么您不想使用long或int。关于可移植数据类型的IBM链接
如果你没有stdint.h,你可以找一份布莱恩·格拉德曼的brg_types.h的拷贝。
brg_types.h将发现平台上各种整数的大小,并为常见大小(8、16、32和64位)创建typedef。
- 实际上,在查看我发现的一些"brg_types.h"时,这个文件只定义了无符号整数(例如"uint_8t"、"uint_16t"、"uint_32t"和"uint_64t")。运算需要有符号整数。
C99或更高版本
使用。
如果您的实现支持2的补码32位整数,那么它必须定义int32_t。
如果不是这样,那么下一个最好的方法是int_least32_t,它是由至少32位的实现所支持的整数类型,而不管表示(两个补码、一个补码等)。
还有一个int_fast32_t,它是一个至少32位宽的整数类型,其选择的目的是允许对该大小要求进行最快的操作。
美国国家标准委员会
您可以使用long,由于标准规定的最小范围要求,保证至少32位宽。
如果您希望使用最小的整数类型来适应32位的数字,那么您可以使用如下的预处理器语句和中定义的宏:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #define TARGET_MAX 2147483647L
#if SCHAR_MAX >= TARGET_MAX
typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
typedef short int32;
#elif INT_MAX >= TARGET_MAX
typedef int int32;
#else
typedef long int32;
#endif
#undef TARGET_MAX |
号
stdint.h是显而易见的选择,但它不一定可用。
如果您使用的是可移植库,它可能已经提供了可移植的固定宽度整数。例如,sdl有Sint32(s代表"signed"),glib有gint32。
此外,根据您的目标平台,您可以为构建系统使用自动工具
它将查看stdint.h/inttypes.h是否存在,如果不存在,将在"config.h"中创建适当的typedef。
如果stdint.h不适用于您的系统,请创建您自己的系统。我总是有一个名为"types.h"的文件,其中包含所有有符号/无符号8、16和32位值的typedef。