我知道字符变量的范围是从(有符号)-128 到 127 和(无符号)0 到 255
char x;
x = 128;
printf("%d\n", x);
但它是如何运作的呢?为什么我得到-128
for x
?
printf
是一个可变参数函数,仅提供第一个参数的精确类型。
这意味着默认促销适用于以下参数,因此所有排名小于的整数int
被提升为int
or unsigned int
,并且所有排名较小的浮点值double
被提升为double
.
如果您的实施有CHAR_BIT
8个,简单char
已签名并且您有一个强制的 2s 补码实现,因此您得到
128(字面值)到 -128(char
/signed char
)到-128(int
)打印为int
=> -128
如果满足所有列出的条件但强制 2s 补码实现,您将获得一个信号或某个实现定义的值。
否则你会得到 128 的输出,因为 128 适合char
/ unsigned char
.
案例 2 的标准报价(感谢 Matt挖掘正确的参考 https://stackoverflow.com/questions/23691891/printing-declared-char-value-in-c/23691986#comment36404354_23692116):
6.3.1.3 有符号和无符号整数
1 当整数类型的值转换为_Bool以外的其他整数类型时,如果
该值可以用新类型表示,它没有改变。
2 否则,如果新类型是无符号的,则通过重复添加或来转换该值
比新类型可以表示的最大值减一
直到该值在新类型的范围内。60)
3 否则,新类型是有符号的,并且值不能在其中表示;要么
结果是实现定义的或引发实现定义的信号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)