C语言中的隐式类型转换

Posted TangguTae

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中的隐式类型转换相关的知识,希望对你有一定的参考价值。

C语言的整型运算至少以缺省整型类型的精度来进行的。

在表达式中,字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

整型提升的意义:

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。

例如:

char c1 = -1;

c1二进制补码中只有8个bit位,-1的二进制是1111 1111,因为是有符号数,所以在整型提升的过程中,高位补符号位,-1赋值给c1的时候,首先先提升成int型即1111 1111 1111 1111 1111 1111 1111 1111,然后赋值给c1,截断,只保留低八位。

char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");

上面这段代码是整型提升的一个很好的例子

a==0xb6,其中0xb6默认是整形高位为0省略了,实际上是0x000000b6,而a在进行比较的时候发生了整型提升变为0xffffffb6,所以二者不相等。同理b也一样。而c本身是int类型,不需要整型提升,所以最终结果为打印一个字符c。

char c = 1;
printf("%u\\n", sizeof(c));
printf("%u\\n", sizeof(+c));
printf("%u\\n", sizeof(++c));

分别输出1,4,1;c是char类型占用一个字节的大小,+c中的c参与表达式运算,发生整型提升,所以输出的是4,++c只是单独改变c的值,相当于c=c+1;最终还是char类型。

char c = -128;
printf("c=%u",c);

最终输出的结果为4294967168;

原因是-128补码是1000 0000,char类型转换成无符号整型也需要整型提升,最高位补符号位

1111 1111 1111 1111 1111 1111 1000 0000,这个值对应的十进制下的值就是4294967168。

以上是关于C语言中的隐式类型转换的主要内容,如果未能解决你的问题,请参考以下文章

C的隐式类型转换

Scala中的隐式转换|理解

JavaScript的数据类型的隐式转换

向量从一种类型到另一种c ++的隐式转换

25.scala的隐式转换

什么是C语言中的隐式函数声明?