什么是表达式的确切类型:添加两个unsigned char类型的值

时间:2012-05-08 18:46:43

标签: c visual-c++

unsigned char c0=255,c1=1;
char c2=c0+c1;   //(1)

没有任何警告(/ W4),c2为0

int i=c0+c1;    //(2)

没有任何警告(/ W4),我是256

表达式的类型是什么(c0 + c1)?如果是unsigned char,为什么不在(2)中为0。如果为int,为什么在(1)中没有警告。

似乎与“整体推广”有关。

帮助!!!

2 个答案:

答案 0 :(得分:2)

unsigned char c0=255,c1=1;
char c2=c0+c1;

c0 + c1的类型为int,其评估结果为256。将int值分配给char时,此c2值会转换为int i=c0+c1; 。不需要警告,因为您始终可以分配任何不同算术类型的操作数。 (从技术上讲,它是一个初始化,但相同的类型和转换约束适用于赋值和初始化)。

c0 + c1

int仍然是{{1}}类型,并且在分配期间不会发生转换。

答案 1 :(得分:0)

在案例1中,类型为 unsigned char ,因为您已将c2的类型指定为unsigned char,而在案例2中,类型为 int ,因为您已指定i的类型为int。