此代码:
signed char a = 128;
a++;
printf("%d", a);
打印'-127'的值。 我理解为什么会这样,当它达到极限并且从那里开始时,基本上值“重置”,但是我很难发现它是否在标准中指定,或者它只是我编译器的随机动作?
答案 0 :(得分:3)
假设最常见的平台有8位char
类型和2位补码(x86,ARM,MIPS,PPC,MSP430等),会发生以下情况:
128
对于signed char
来说太大了。它以实现定义方式转换为signed char
。通常它只是截断和位复制(1:1)。在2的补码中,0b1000000
是signed char
中小数-128的2的补码表示。-128 + 1 -> -127
在其他平台上,结果会有所不同,但很可能只会使用int
常量128
的低位。
要检测此类缺陷(但不是全部),请启用编译器警告并注意它们。 gcc将报告初始化的截断警告(-Wconversion
)。
答案 1 :(得分:-2)
signed char是从-128到127。
没有警告吗? = 128?从-128 + 1 = -127,没关系。
在运行时从127 + 1到-128,编译器不应该在那里计算。