当前位置:   article > 正文

整型提升和算术转换<C语言>

整型提升和算术转换<C语言>
前言

        在C语言中进行整数运算时,我们通常把操作数设置为int型变量,按照整数的精度计算,如果是非int型的整数进行计算时,会有那些变化呢?

整型提升

        关于整型提升的情况,通常发生在char型和short int型中,它们进行整数运算时会被转化为普通整型,因为在C语言编译器中总是会把整数的运算以整型精度计算,CPU不会进行8个bit位与8个bit位的运算,它在进行整数算术运算时的操作数是32位4字节的运算,综上,发生整型提升。

        转换原则

        有符号整数,符号位,高位填充

        无符号整数,0,高位填充

案例:

  1. #include<stdio.h>
  2. int main() {
  3. char a = 20;
  4. char b = 130;//char一般为有符号char
  5. char c = a + b;
  6. //a=000000000000000000000000 00010100//有符号整数填充符号位,且整数原反补码一致。
  7. //b=111111111111111111111111 10000010//两个数整型提升完毕
  8. //c=111111111111111111111111 10010110//相加
  9. //c=10010110//截断,还原成char型,且是补码
  10. // %d打印的是int型整数,还会发生一次整型提升
  11. //c=111111111111111111111111 10010110//补码
  12. //c=100000000000000000000000 01101010//符号位不变,取反加1,还原原码
  13. //c=-106
  14. printf("%d", c);
  15. return 0;
  16. }

运行结果:

         可以看到最后运行的结果是-106,为什么两个整数相加会得到一个负数呢?

char类型的大小为1字节,8个比特位(第一个为符号位),所以只能表示-2的7次方~2的7次方,也就是-128到127,当数值超过127和就会来到负数的地盘(可以看做一个循环),

本人画的丑图:

 算术转换

        当两个运算数字节大小大于int型且为不同类型时,就会将低字节数值转化为高字节数值类型

如int 和unsigned into型计算时。

案例:

  1. 算术转换
  2. #include<stdio.h>
  3. int main() {
  4. int a = -1;
  5. unsigned int c;
  6. c = a - sizeof(a);//sizeof的返回类型是sizeof_t型,同时也是一个无符号整数
  7. //变量a在运算时会被转换为unsigned int型(取值范围为0到2的32次方),-1就会越界来到2的32次方减一。
  8. //c=2的32次方(4294967295)-4
  9. printf("%u", c);
  10. return 0;
  11. }

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/545403
推荐阅读
相关标签
  

闽ICP备14008679号