C语言隐式类型转换

大家好,我们今天来补充一个内容,关于C语言隐式类型转换。

C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型
提升。

那么我们进行整形提升究竟有什么意义呢?

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

那么我们要怎样做才能实现整形提升呢?
首先我们看到下面的事例:

char a,b,c;
...
a = b + c;

首先b和c的值被提升为普通整型,然后再执行加法运算。加法运算完成之后,结果将被截断,然后再存储于a中。

看到下面这个题:

//负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//无符号整形提升,高位补0

因为字符型的变量只有一个字节,而一个字节有8个比特位,我们要将字符型的变量进行加减的之后首先给它进行整形提升,即给它的补码高位补充符号位,例如例题中的c1=-1,因为在二进制中1表示负,所以32个比特位除了之前的8个比特位外,其他的比特位全补上1,即11111111111111111111111111111111,而c2=1的补码为00000001,整形提升补充符号位0,提升之后为00000000000000000000000000000001。

那么接下来我们看到下面这个例题:

#include  
 int main()  
 {  
    char a = -128;  
    printf("%u\n",a);  
    return 0;  
}

C语言隐式类型转换_第1张图片
我们可以看到打印的结果是个非常大的正数这是怎么回事呢?而且char类型的最大存储为127,我们已经知道了-128的补码序列,现在把它提出来(1000 0000 ),但是你是希望计算 机以%u的形式打印出来,所以你要对-128的补码形式进行补充,根据它的符号位补上1,即1111 1111 1111 1111 1111 1111 1000 0000,这里的%u,我们都应该知道数据在内存中是以补码形式存储的,现在%u输出也就是认为你就是无符号数,所以在%u的角度来讲,它直接从你的内存中拿出来的就是原码,直接输出内存中拿出来的数据.我们用计算器将这个数转换为二进制看看结果。
C语言隐式类型转换_第2张图片
我们看到二进制的结果和上述的一致,所以就是00000000000000000000000000000001。

好了,今天的分享就到这里,相信大家对于整形提升都有了很深刻的认识吧,谢谢大家。
C语言隐式类型转换_第3张图片

你可能感兴趣的:(c语言,开发语言)