什么是整形提升 在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型?
什么是表达式
整形有哪些
例题:
#include <stdio.h> int main() { char a= -1;//有符号char类型的a signed char b=-1;//有符号char类型的b unsigned char c=-1;//无符号char类型的c printf ("a=%d , b=%d , c=%d" ,a,b,c);//以有符号整数的形式输出a,b,c return 0; }
分析
-1是一个整数
原码是10000000000000000000000000000001;
反码是 11111111111111111111111111111110;
补码是 11111111111111111111111111111111;
因为char类型向内存申请空间时只得到八个比特位大小的空间
因而存储进char a的是11111111
在输出时,因为a=%d是赋值表达式,a又是char类型,因此要进行整形提升。
那么如何进行整形提升呢?这就涉及到整形提升的规则了
C语言规定,有符号数进行整形提升时,高位补符号位的数字
无符号进行整形提升时,高位补0
因此此时a中存储的是11111111111111111111111111111111
要输出还需把补码转换成原码(注:C语言中存储的是补码,显示的是原码)
对补码取反+1(或者-1取反)即可得到原码10000000000000000000000000000001
因而输出的a是-1,b与a同理
接下来分析unsigned char c。
char c中存储的是11111111,进行整形提升后是00000000000000000000000011111111
由于c是无符号数,因而它的原码补码反码相同(正数也是如此)
以有符号整数形式输出的结果是255
因而最终输出的结果是a=-1,b=-1,c=255
有符号数与无符号数相加时,有符号数的符号位要参与计算
int i= -20; unsigned int j = 10; printf("%d\n", i+j);
10000000000000000000000000010100原码
11111111111111111111111111101011反码
11111111111111111111111111101100补码
00000000000000000000000000001010原码/反码/补码
11111111111111111111111111110110
10000000000000000000000000001001
10000000000000000000000000001010