> 文章列表 > C语言——隐式转换

C语言——隐式转换

C语言——隐式转换

目录

前言

隐式转换

1.整型提升

2.算数转换


前言

这里小编给大家简单的补充一下,一些有关C语言的知识点


隐式转换

由于转换形式的不同类型转换这里一共分为整型提升和运算转换两种形式

1.整型提升

在了解整型提升之前,这里我们需要先了解一下截断这个概念,对于截断操作,这里我举个例子给大家简单的说明一下

这里我们举一个例子,这里char a=1,但是对于char存储的大小仅仅只是8字节,那么对于常量1,这里却是一个整型,占了32字节,那么为了存储这个变量我们这里就会发生截断操作,对于截断的规则如下:从低位开始,选取处该需要存储的字节大小。

也即是:

 所以存储在变量a中也就是0 0  0 0  0 0 0 1。

那么整型提升又是什么呢?

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

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

那么对于整型提升的具体过程又是怎么的呢?

这里我们以char类型给大家简单演示一下:

大家可能平时会见到这样的代码:

int main()
{char a = 127;char b = 3;char c = a + b;printf("%d", c);return 0;
}

这里我们先直接看结果:

 大家都知道有符号得char类型得表示范围是-127~128,那么这里就不会出现存储130值的char类型,那么该又是怎么得到-126这个值的呢?

这里其实就发生了整型提升和截断的两个过程

首先我们进行运算就需要进行整型提升:

127的补码如下: 

 01111111

进行整型升后得到的是

00000000000000000000000001111111

3的补码是

00000011

整型提升后的值是:

00000000000000000000000000000011

然后我们把整型提升后的值进行相加得到:

00000000000000000000000010000010.

然后我们需要将其存入c,因为c是char类型,所以这里我们要对其进行截断操作,那么我们得到c的补码是:10000010。

然后我们对其进行打印操作,由于我们是将其按整型的形式打印出来,所以这里我们要进行整型提升,也就得到:11111111111111111111111110000010.

由于该是负数,这里我们就需要将其转化为原码输出,所以这里我们转换成原码后得到

10000000000000000000000001111110.

所以这里按二进制转十进制后,得到的值是:-126.

2.算数转换

对于小于整型的情况我们使用的是整型提升的方式,但是对于大于int的类型,我们采用的是算数转换的方式。那么对于算数转换的规则是:
int->unsigned int->long int->unsigned long int->float->double->long double

这里给大家简单举一个例子,这里我们使用到sizeof函数,这里有一点我们需要注意的是sizeof的返回值是unsigned int,那么下面我们直接看代码

int main()
{int i = -1;if (i < sizeof(i)){printf("haha");}else{printf("hehe");}
}

这里如果没有隐式转换,那么我们得到的值应该是haha,但是由于我们 i变量发生了隐式转换,遂于-1的无符号数,该是特别大的,所以我们这里的打印值应该是呵呵。

这里我们看运行结果: