C - 超过限额 - 标准规则

时间:2017-05-01 12:34:13

标签: c size limit standards

此代码:

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

打印'-127'的值。 我理解为什么会这样,当它达到极限并且从那里开始时,基本上值“重置”,但是我很难发现它是否在标准中指定,或者它只是我编译器的随机动作?

2 个答案:

答案 0 :(得分:3)

假设最常见的平台有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)。

答案 1 :(得分:-2)

signed char是从-128到127。

没有警告吗? = 128?

从-128 + 1 = -127,没关系。

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