ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C语言 — 整型提升和算数转换

C语言 — 整型提升和算数转换

一.什么是整形提升?

CPU内整形运算器的操作数的字节长度,一般是 int 类型的长度 。C的整数运算总是以整型类型的进度来进行的。为了获取这个精度,表达式中字符短整型操作数在使用之前被转换为普通整形,这种转换称为整形提升

二.怎么进行整形提升?

规则:整形提升是按照变量的数据类型的符号位来提升

负数的整形提升

char c1 = -1;

变量c1的二进制补码中,只有8个比特位,即1111 1111

怎么得到这个结果的?

-1 是整数,即 4个字节 32个比特位.

-1的原码:1000 0000 0000 0000 0000 0000 0000 0001

-1的反码:1111 1111 1111 1111 1111 1111 1111 1110

-1的补码:1111 1111 1111 1111 1111 1111 1111 1111

因为c1只有8个比特位,放不下一个整形(32个比特位),此时就会发生截断只把最后面的8个比特位放进c1里。

c1的整形提升:c1是有符号char, 整形提升的时候 ,最高位补充符号位 1 。

即 1111 1111 1111 1111 1111 1111 1111 1111

正数的整形提升

char c2 = 1;

变量c2的二进制补码中,只有8个比特位,即0000 0001。

怎么得到这个结果的?

1 是整数,即 4个字节 32个比特位。因为是正数原码反码补码都是一样的。

1 的补码:0000 0000 0000 0000 0000 0000 0000 0001

因为c2只有8个比特位,放不下一个整形(32个比特位),此时就会发生截断只把最后面的8个比特位放进c1里。

c1的整形提升:c1是有符号char, 整形提升的时候 ,最高位补充符号位 0 。

即 0000 0000 0000 0000 0000 0000 0000 0001

无符号数

无符号数整型提升,最高位补0。

三.整形提升的示例

int main() { char a = 5; char b = 126; char c = a + b; printf("%d\n", c); return 0; }

这个代码运行的结果是什么呢?

下面来分析:

5 是正数,原反补都一样。

5 的补码:0000 0000 0000 0000 0000 0000 0000 0101

然后截断最后8个比特位,a里存放 0000 0101。

126 的补码:0000 0000 0000 0000 0000 0000 0111 1110

截断最后8个比特位,b里存放 0111 1110。

在这个表达式中 c = a + b ,a 和 b 是达不到一个整形的大小,整形提升。

0000 0000 0000 0000 0000 0000 0000 0101

0000 0000 0000 0000 0000 0000 0111 1110

整型提升后执行运算。

结果 :0000 0000 0000 0000 0000 0000 1000 0011

运算完,截断,存放1000 0011 。

最后打印的是%d (打印整形)这个时候,又整形提升这次最高位是 1

整型提升的结果:1111 1111 1111 1111 1111 1111 1000 0011

还没完,这次得到的整形提升的结果是补码。

-1 得到反码1111 1111 1111 1111 1111 1111 1000 0010

取反得到原码1000 0000 0000 0000 0000 0000 0111 1101

如果把这个补码放到程序员计算器里,就会最终得到这个数字:-125

这里还有一个例子

int main() { char c1 = 1; short c2 = 1; printf("%u\n", sizeof(c1)); printf("%u\n", sizeof(c2)); printf("%u\n", sizeof(+c1)); printf("%u\n", sizeof(+c2)); printf("%u\n", sizeof(-c1)); printf("%u\n", sizeof(-c2)); }

这种 +c1(c2)和 -c1(c2) 也是表达式,计算大小的时候也会发生整形提升。

四.什么是算数转换?

如果某个操作符的各个操作数,属于不同类型,除非一个操作数转换位另一个操作数的类型,否则操作就无法进行。

和整形提升不的是,整形提升都是< int 的数据类型。而>= int 是算术转换的数据类型

寻常算术转换的层次体系

long double double float unsigned long int long int unsigned int int

例如:

操作数是float 类型 和 double 类型的时候,float 就会转换为double 进行运算

如果某个操作数的类型在上面的排行中,次位较低,要转换为另一个操作数的类型后进行运算。但是算术转换要合理,不然会有丢失进度的风险。

例如:

float f = 3.14; int num = f; //会有进度的丢失

看到这里不知道你对整形提升和算数转换是否增加一些看法呢,最后也是,byebye

返回列表