将两个无符号字符型变量相加,结果为整型

12

这里有一段代码:

#include <iostream>
int main(){
  unsigned char a = 4, b = 255;
  int g = (unsigned char)a + (unsigned char)b;
  std::cout << g << std::endl;
  return 0;
}

结果:

259

为什么结果是259而不是3?如果加了两个无符号字符变量,应该会溢出,结果应该是3,然后将从unsigned char 3转换为int 3。

2个回答

15

加法操作会先将操作数提升int,然后再进行加法操作。这就是 C 语言的工作方式。如果你想截断结果,需要将其重新赋值给一个更窄的类型,例如 unsigned char


11

整数运算从不在比 int 小的数据类型上执行。例如,对于小于int类型的类型,例如如果两个类型charshort int相加,则在执行任何算术操作之前将它们提升为int,结果是一个整数类型。如果其中一个类型比int大,例如long long intint,则int被提升为long long int,结果为long long int

(§4.5/1)- 如果int可以表示源类型的所有值,则char、signed char、unsigned char、short int或unsigned short int类型的rvalue可转换为int类型的rvalue;否则,源rvalue可转换为无符号int类型的rvalue。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接