C - 超过字符限制 - 标准规则

C - Going over char limit - standard rules

此代码:

signed char a = 128;
a++;
printf("%d", a);

打印“-127”的值。 我明白为什么会这样,基本上是 "resets" 当它达到极限并从那里开始时的值,但我很难确定它是否在标准中指定,或者它只是我的编译器执行的随机操作?

signed char 是从 -128 到 127。

没有警告吗? = 128?

从-128+1=-127就可以了

在 运行 时间从 127 + 1 到 -128 编译器不应该在那里计算。

假设最常见的平台具有 8 位 char 类型和 2 的补码(x86、ARM、MIPS、PPC、MSP430 等),会发生以下情况:

  • 128 对于 signed char 来说太大了。它以 实现定义的 方式转换为 signed char。通常它只是被截断和位复制 (1:1)。在 2 的补码中,0b1000000signed char.
  • 中十进制 -128 的 2 的补码表示
  • 下面的加法是基础数学:-128 + 1 -> -127

在其他平台上,结果会有所不同,但很可能它们只使用 int 常数的低位 128

要检测此类缺陷(但不是全部),请启用编译器警告并注意它们。 gcc 将报告初始化程序的截断警告 (-Wconversion)。