赞
踩
在C语言中进行整数运算时,我们通常把操作数设置为int型变量,按照整数的精度计算,如果是非int型的整数进行计算时,会有那些变化呢?
关于整型提升的情况,通常发生在char型和short int型中,它们进行整数运算时会被转化为普通整型,因为在C语言编译器中总是会把整数的运算以整型精度计算,CPU不会进行8个bit位与8个bit位的运算,它在进行整数算术运算时的操作数是32位4字节的运算,综上,发生整型提升。
有符号整数,符号位,高位填充
无符号整数,0,高位填充
案例:
- #include<stdio.h>
- int main() {
- char a = 20;
- char b = 130;//char一般为有符号char
- char c = a + b;
- //a=000000000000000000000000 00010100//有符号整数填充符号位,且整数原反补码一致。
- //b=111111111111111111111111 10000010//两个数整型提升完毕
- //c=111111111111111111111111 10010110//相加
- //c=10010110//截断,还原成char型,且是补码
- // %d打印的是int型整数,还会发生一次整型提升
- //c=111111111111111111111111 10010110//补码
- //c=100000000000000000000000 01101010//符号位不变,取反加1,还原原码
- //c=-106
- printf("%d", c);
- return 0;
- }
运行结果:
可以看到最后运行的结果是-106,为什么两个整数相加会得到一个负数呢?
char类型的大小为1字节,8个比特位(第一个为符号位),所以只能表示-2的7次方~2的7次方,也就是-128到127,当数值超过127和就会来到负数的地盘(可以看做一个循环),
本人画的丑图:
当两个运算数字节大小大于int型且为不同类型时,就会将低字节数值转化为高字节数值类型
如int 和unsigned into型计算时。
案例:
- 算术转换
- #include<stdio.h>
- int main() {
- int a = -1;
- unsigned int c;
- c = a - sizeof(a);//sizeof的返回类型是sizeof_t型,同时也是一个无符号整数
- //变量a在运算时会被转换为unsigned int型(取值范围为0到2的32次方),-1就会越界来到2的32次方减一。
- //c=2的32次方(4294967295)-4
- printf("%u", c);
- return 0;
- }
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。