在以下示例中:
#include <iostream>
#include <typeinfo>
int main()
{
unsigned char a, b, c;
a = 100;
b = 100;
c = 100;
int x = (a + b + c);
std::cout << "typeid(a + b + c) = " << typeid(a + b + c).name() << std::endl;
std::cout << "x = " << x << std::endl;
std::cout << "a + b + c = " << a + b + c << std::endl;
return 0;
}
我们得到输出:
typeid(a + b + c) = i
x = 300
a + b + c = 300
如您所见,无符号字符的总和没有溢出,并且总和的类型结果是 int。这对我来说很奇怪,在我看来,标准保证无符号类型溢出,除以最大可表示数的余数,也就是说,在上面的例子中,x 应该等于 300% 256 = 44 .
我的错误是什么?最好参考标准或 cppreference。
PS。实验链接:http ://cpp.sh/7t35b
翻译:
在您的示例中,当您运行加法函数时,任何char参数都会自动转换为int。
编译器存储一个字节的数据,并像使用整数参数一样执行加法。