欢迎光临
我们一直在努力

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) 也是表达式,计算大小的时候也会发生整形提升。

看到这里不知道你对整形提升增加一些看法,最后也是,byebye

赞(0)
未经允许不得转载:171主机测评 » C语言 — 整型提升
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址