Vil*_*ray 1 c memory types c99 endianness
为了确定系统的字节顺序,我计划将多字节整数值存储在变量中,并通过;包装来访问第一个字节。例如:unsigned charunion
union{
unsigned int val;
unsigned char first_byte;
} test;
test.val = 1; /* stored in little-endian system as "0x01 0x00 0x00 0x00" */
if(test.first_byte == 1){
printf("Little-endian system!");
}else{
printf("Big-endian system!");
}
Run Code Online (Sandbox Code Playgroud)
我想让这个测试可以跨平台移植,但我不确定 C99 标准是否保证数据unsigned int类型的大小大于1 个字节。此外,由于“C 字节”在技术上不必是 8 位大小,因此我无法使用精确宽度的整数类型(例如uint8_t、uint16_t等)。
C99 标准是否保证 C 数据类型的大小至少为两个字节?
PS假设 anunsigned int实际上大于一个字节,我的union行为是否会在所有 C99 兼容平台上按照我的预期(变量first_byte访问variable 中的第一个字节val)?
由于int必须具有至少 16 位的范围,int因此将满足大多数实际系统上的标准。short(和long,和)也是如此long long。如果您想要正好 16 位,则必须查看 和 是否int16_t在uint16_t中声明<stdint.h>。
如果您担心CHAR_BIT大于 8 的系统,那么您必须更加努力。如果CHAR_BIT是 32,则只能long long保证容纳两个字符。
理查德·J·罗斯三世 (Richard J Ross III)在评论中说道:
\n\n\n\n\n该标准对 int 的大小没有任何规定,只是它必须大于或等于短整型,因此,例如,在我工作过的某些系统上它可能是 10 位。
\n
相反,C 标准对不同类型必须支持的范围下限有规范,10 位的系统int将不符合 C。
具体来说,在 ISO/IEC 9899:2011 \xc2\xa75.2.4.2.1 Sizes of integer types<limits.h>中,它说:
\n\n\xc2\xb61 下面给出的值应替换为适合在
\n\n#if\n 预处理指令中使用的常量表达式。此外,除了CHAR_BIT和 之外MB_LEN_MAX,\n 下面的表达式应替换为具有相同类型的表达式,\n 表达式是根据整数提升转换的相应类型的对象。它们的实现定义的值的大小(绝对值)应等于或大于所示的值,并具有相同的符号。\xe2\x80\x94 非位字段(字节)的最小对象的位数\n
\n\nCHAR_BIT 8[...]
\n\n\xe2\x80\x94 类型对象的最小值
\n\nshort int\n\n
SHRT_MIN -32767// \xe2\x88\x92(2 15 \xe2\x88\x92 1)\xe2\x80\x94 类型对象的最大值
\n\nshort int\n\n
SHRT_MAX +32767// 2 15 \xe2\x88\x92 1\xe2\x80\x94 类型对象的最大值
\n\nunsigned short int\n\n
USHRT_MAX 65535// 2 16 \xe2\x88\x92 1\xe2\x80\x94 类型对象的最小值
\n\nint\n\n
INT_MIN -32767// \xe2\x88\x92(2 15 \xe2\x88\x92 1)\xe2\x80\x94 类型对象的最大值
\n\nint\n\n
INT_MAX +32767// 2 15 \xe2\x88\x92 1\xe2\x80\x94 类型对象的最大值
\n\nunsigned int\n
UINT_MAX 65535// 2 16 \xe2\x88\x92 1