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 的补码中,0b1000000
是 signed char
. 中十进制 -128 的 2 的补码表示
- 下面的加法是基础数学:
-128 + 1 -> -127
在其他平台上,结果会有所不同,但很可能它们只使用 int
常数的低位 128
。
要检测此类缺陷(但不是全部),请启用编译器警告并注意它们。 gcc 将报告初始化程序的截断警告 (-Wconversion
)。
此代码:
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 的补码中,0b1000000
是signed char
. 中十进制 -128 的 2 的补码表示
- 下面的加法是基础数学:
-128 + 1 -> -127
在其他平台上,结果会有所不同,但很可能它们只使用 int
常数的低位 128
。
要检测此类缺陷(但不是全部),请启用编译器警告并注意它们。 gcc 将报告初始化程序的截断警告 (-Wconversion
)。