有代码:
#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?如果添加了两个unsigned char变量,则应该有溢出,结果应为3,然后它应该从unsigned char 3转换为int 3.
答案 0 :(得分:14)
在添加操作之前,添加操作将首先promote其操作数添加到int
。这就是C的工作原理。如果要截断,则需要将其分配回更窄的类型,例如unsigned char
。
答案 1 :(得分:7)
从不对小于int
的数据类型执行整数运算。例如,对于小于int
的类型,例如如果添加了两个类型char
和short int
,则在任何算术运算之前将它们提升为int
,结果为整数类型。如果其中一个类型恰好大于int,例如long long int
和int
,那么int将被提升为long long int
,结果为long long int
。
(§4.5/ 1) - char类型的rvalue,signed char,unsigned char,short int或unsigned short 如果int可以表示,int可以转换为int类型的rvalue 源类型的所有值;否则,源rvalue可以 转换为unsigned int类型的右值。