初学:C语言截断与整型提升。

1.截断

截断当数据大小超过本身类型的最大值或者最小值时,就会进行截断

截断从左侧开始,保留右侧数值。

例如:

无符号整形a的二进制数为 11111111111111111111111111111111

当进行a+1运算时,a+1的二进制数为100000000000000000000000000000000

因为整形变量为四个字节,一个字节两个比特位,一个比特位为2*10^4,此时大于2*10^32就会从左侧开始进行进行截断。

截断前100000000000000000000000000000000

截断后 00000000000000000000000000000000

此时无符号整形a的值即为0;

++

在此有个更好的例子来解释

1的二进制补码为01111111111111111111111111111111

-1的二进制数补码为11111111111111111111111111111111

相加即为100000000000000000000000000000000

此时超过4个字节的大小,从左侧开始发生截断,直至为4个字节大小时停止,此时将一截断

得到二进制数00000000000000000000000000000000为零。

2.截断与整形提升

unsigned char 0~255

signed char -128~127

整形提升:简单来说就是,当某一类型的一个变量在使用时,这个变量它的类型小于一个整形时,

在进行使用时就会进行整形提升(有符号(signed)按照高位补数,无符号(unsigned)直接补零)

例如:

1.

我们先看a1

-1的二进制原码为10000000000000000000000000000001

                 反码    1111111111111111111111111111111111110

                 补码    1111111111111111111111111111111111111

截断    11111111

整型提升

因为a为有符号字符型变量,所以按位补最高位

11111111111111111111111111111111(内存中补码)

1000000000000000000000000000(反码)

1000000000000000000000000001 (输出原码)

char a=-1;

but

当目光来到 unsigned char a3 时

-1的二进制原码为10000000000000000000000000000001

                 反码    1111111111111111111111111111111111110

                 补码    1111111111111111111111111111111111111

截断    11111111

————因为无符号整型提升默认补零————

整形提升

00000000000000000000000011111111(正数,补码即原码)

所以a3=255;

i是为了证明在储存时就已经进行了截断和整形提升。

2.

当在有符号类型变量整形提升时被打印为无符号整形时,在打印时会默认此变量为正数,直接进行打印,不再转码。

128的二进制为00000000000000000000000010000000(原码)

                        011111111111111111111111111011111111(反码)

                        01111111111111111111111111111000000(补码(储存在内存中的为补码))

因为a为字符型变量,所以发生截断

a-->10000000

当进行无符号打印时由于a为有符号字符型变量,所以此时整型提升按最高位补数

a-->11111111111111111111111110000000

当进行无符号打印时,编译器会默认该数为整数,不在考虑符号位。

此时a的值就为4294967168

———————————————————————————————————————————

ps.无符号变量没有符号位,就比如:

signed char 的取值范围为-128~127

而unsigned char 的取值范围就为0~255

———————————————————————————————————————————

同时看第二张图

a-->-128

按照上述方法也可得出此值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值