在C99 标准的第 7.18.1.1 节第 1 段中:
typedef 名称
intN_t
指定宽度为N的有符号整数类型,无填充位和二进制补码表示。
根据 C99 标准,精确宽度的有符号整数类型需要具有二进制补码表示。这意味着,例如,int8_t
与的补码-128
最小值相反,最小值为。-127
第 6.2.6.2 节第 2 段允许实现决定是否将符号位解释为符号和幅度、二进制补码或二进制补码:
如果符号位为 1,则应通过以下方式之一修改该值:
— 符号位为 0 的对应值取反(符号和幅度);
— 符号位的值为 -(2 N )(二进制补码);
— 符号位的值为 -(2 N - 1)(个数补码)。
方法之间的区别很重要,因为二进制补码( ) 中整数的最小值-128
可能超出二进制补码( -127
to 127
) 中可表示的值范围。
假设一个实现将int
类型定义为具有ones' complement
表示,而该int16_t
类型具有two's complement
C99 标准所保证的表示。
int16_t foo = -32768;
int bar = foo;
在这种情况下,从int16_t
到的转换是否int
会导致实现定义的行为,因为 持有的值foo
超出了 可表示的值范围bar
?