为什么涉及变量的操作不会在C中溢出

Ser*_*rge 1 c

我在C中有一个类似的代码:

int main(){
   unsigned char var1;

   var1 = 255;
   var1 = var1 + 1;

   printf("The result is = %i", var1);

}
Run Code Online (Sandbox Code Playgroud)

我认为它会溢出,因为var1的最大类型最多为255,因此当你将它增加到1时,它将是256但结果为0.

但是,当我修改代码时,这样:

int main(){
   unsigned char var1;

   var1 = 255+ 1;

   printf("The result is = %i", var1);

}
Run Code Online (Sandbox Code Playgroud)

结果会出现溢出错误,例如"警告:从'int'到'unsigned char'的无符号转换将值从'256'更改为'0'[-Woverflow]".

为什么第一个代码没有溢出?

Rob*_*vey 6

无符号字符(基本上是一个字节)的环绕是设计的.

然而,你的第二个例子是增加两个整数.将int中的256转换为字节中的零会构成信息丢失; 因此警告.

  • 第一种情况也将`int`值`256`转换为一个字节(整数提升适用于`var1 + 1`中的操作数) (2认同)