是否有保证至少两个字节的 C99 数据类型?

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_tuint16_t等)。

C99 标准是否保证 C 数据类型的大小至少为两个字节?

PS假设 anunsigned int实际上大于一个字节,我的union行为是否会在所有 C99 兼容平台上按照我的预期(变量first_byte访问variable 中的第一个字节val)?

Jon*_*ler 5

由于int必须具有至少 16 位的范围,int因此将满足大多数实际系统上的标准。short(和long,和)也是如此long long。如果您想要正好 16 位,则必须查看 和 是否int16_tuint16_t中声明<stdint.h>

\n\n

如果您担心CHAR_BIT大于 8 的系统,那么您必须更加努力。如果CHAR_BIT是 32,则只能long long保证容纳两个字符。

\n\n
\n\n

C 标准对整数类型大小的规定

\n\n

理查德·J·罗斯三世 (Richard J Ross III)在评论中说道:

\n\n
\n

该标准对 int 的大小没有任何规定,只是它必须大于或等于短整型,因此,例如,在我工作过的某些系统上它可能是 10 位。

\n
\n\n

相反,C 标准对不同类型必须支持的范围下限有规范,10 位的系统int将不符合 C。

\n\n

具体来说,在 ISO/IEC 9899:2011 \xc2\xa75.2.4.2.1 Sizes of integer types<limits.h>中,它说:

\n\n
\n

\xc2\xb61 下面给出的值应替换为适合在#if\n 预处理指令中使用的常量表达式。此外,除了CHAR_BIT和 之外MB_LEN_MAX,\n 下面的表达式应替换为具有相同类型的表达式,\n 表达式是根据整数提升转换的相应类型的对象。它们的实现定义的值的大小(绝对值)应等于或大于所示的值,并具有相同的符号。

\n\n

\xe2\x80\x94 非位字段(字节)的最小对象的位数\n CHAR_BIT 8

\n\n

[...]

\n\n

\xe2\x80\x94 类型对象的最小值short int

\n\n

SHRT_MIN -32767// \xe2\x88\x92(2 15 \xe2\x88\x92 1)

\n\n

\xe2\x80\x94 类型对象的最大值short int

\n\n

SHRT_MAX +32767// 2 15 \xe2\x88\x92 1

\n\n

\xe2\x80\x94 类型对象的最大值unsigned short int

\n\n

USHRT_MAX 65535// 2 16 \xe2\x88\x92 1

\n\n

\xe2\x80\x94 类型对象的最小值int

\n\n

INT_MIN -32767// \xe2\x88\x92(2 15 \xe2\x88\x92 1)

\n\n

\xe2\x80\x94 类型对象的最大值int

\n\n

INT_MAX +32767// 2 15 \xe2\x88\x92 1

\n\n

\xe2\x80\x94 类型对象的最大值unsigned int

\n\n

UINT_MAX 65535// 2 16 \xe2\x88\x92 1

\n
\n

  • @RichardJ.RossIII:如果您可以在其中表示范围“[-32767 .. +32767]”(这是“int”必须支持的值的最小范围),那么这些位很奇怪。 (3认同)
  • 该标准对 int 的大小没有任何规定,只是它必须大于或等于“short”,因此,例如,在我工作过的某些系统上它可能是 10 位。 (2认同)
  • @sepp2k:由于 C 标准不要求字节与八位字节相同,因此没有什么可以阻止“short”成为一个字节长(那么您只需要 16 位字节) (2认同)