C语言中,不同类型的数据在运算时,会转换成同一类型运算。小于整型的,将进行整型提升转化成整型运算,有大于等于整型的情况,转化成更大的类型运算,有符号的转化成为无符号的运算
有符号型整型提升时通常高位补符号位,无符号型整型提升通常高位补0
一、整型提升
C的整型算术运算总是以至少以缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件中执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU是难以实现两个8比特字节直接相加的运算(虽然机器指令中可能有这样的字节相加)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或者unsigned int,然后才能送入CPU去执行运算。
void int_calculate(){
char a =5;
//00000000 00000000 00000000 00000101 --5 正整数原反补相同
//00000101 --a
char b = 126;
//00000000 00000000 00000000 01111110 --126
//01111110 --b
char c = a+b;
//整型运算时先把大小不足的进行整型提升
//00000000 00000000 00000000 00000101 --a
//00000000 00000000 00000000 01111110 --b
//00000000 00000000 00000000 10000011 --a+b
//10000011 --c
//b和c的值被提升为普通整型,然后再执行加法运算
//加法运算完成后,结果将被截断,然后存储于a中
//整型提升是按照变量的数据类型的符号位来提升的
//11111111 11111111 11111111 10000011 --补码
//11111111 11111111 11111111 10000010 --反码
//10000000 00000000 00000000 01111101 --原码 -125
printf("%d\n",c);
}
//整型提升
void test1_1(){
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a == 0xb6)
printf("a\n");
if(b == 0xb600)
printf("b\n");
if(c == 0xb6000000)
printf("c\n");
//输出c
}
//整型提升
void test1_2(){
char c = 1;
printf("%u\n",sizeof(c));//1
printf("%u\n",sizeof(+c));//4
printf("%u\n",sizeof(-c));//4
}
二、有符号与无符号整型
sizeof()返回的是无符号整型,
i是有符号整型,两者比较的时候会转化成无符号整型比较
因此,i被转化成一个很大的无符号整型数
int main(){
int i=-1;
if(i>sizeof(i))
printf(">\n");
else
printf("<\n");
return 0;
}