隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int 的字节长度,同时也是CPU的通用寄存器的长度。 因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。 通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这 种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算
注明:以上整形提升的概念与意义均摘抄于网络,并非本人原创
1.负数的整形提升: char c1 = -1; 变量c1的二进制位(补码)中只有8个比特位: 1111111 因为 char 为有符号的 char 所以整形提升的时候,高位补充符号位,即为1 提升之后的结果是: 11111111111111111111111111111111
2.正数的整形提升 :char c2 = 1; 变量c2的二进制位(补码)中只有8个比特位: 00000001 因为 char 为有符号的 char 所以整形提升的时候,高位补充符号位,即为0 提升之后的结果是: 00000000000000000000000000000001
3.无符号整形提升,高位补0
例子(1):
char a=3; char b=127; char c =a+b;应该输出多少呢?
3的补码:00000000 00000000 00000000 00000011
取低八位:00000011
127的补码:00000000 00000000 00000000 01111111
取低八位:011111111
c=a+b;(相加时要提升成整形)
将3整形提升后:00000000 00000000 00000000 00000011(高位补充符号位,为0)
将127整形提升后:00000000 00000000 00000000 01111111(高位补充符号位,为0)
相加后:00000000 00000000 00000000 10000010
取低八位:10000010
将C整形提升:11111111 11111111 11111111 10000010(高位补充符号位,为1)
C的原码:10000000 00000000 00000000 01111110
打印出结果为(-126)
例子(2):
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
system("pause");
return 0;
}
a,b要进行整形提升,但是c不需要整形提升 a,b整形提升之后,变成了负数,所以表达式 a0xb6 , b0xb600 的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真.所以程序输出的结果是: c
例子(3):
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(!c));
system("pause");
return 0;
}
,c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节.
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof© ,就是1个字节.