双面运算符进行计算时(此处为unsigned int 和Int进行比较运算符运算)
窄字节向宽字节扩充 short=>int=>longlong
有符号int向无符号unsigned in转换
int app(int a){
static int b = 3;
if(a>0) return a*app(--b);
else return 2;
}
int main(){
unsigned int a = 4;
int b = -6;
int res = 0;
if(a>b){ //由于int类型的数据遇上unsigned int类型的数据时会自动转换为int类型进行计算
//(int) -6=> 1111 1111 1111 1111 1111 1111 1111 1010
// => (unsigned int) 4294967290
// 4294967290>4 同理此时如果a>4294967290则if判定为真
int a = 4;
res = app(a);
}else{
int b = 3;
res = app(b);
}
printf("%d\n",res);
return 0;
}
单目运算符进行计算时(此处为unsigned char类型变量取反~后右移>>)
低于int类型(即规定的寄存器大小)的基础类型需要在运算过程中转化为int类型(寄存器的位数)的大小进行计算,然后在运算完成以后再截取成原大小进行结果的表示。由于unsigned char类型的变量比int小,所以会自动向int类型扩充,无符号数补0有符号位补符号位即
0xa5=>1010 0101
=>0000 0000 0000 0000 0000 0000 1010 0101
int main(){
unsigned char a = 0xa5;
unsigned char b = ~a >> 1 + 2 + 3;
printf ("%d\n", b);
}