c语言整形存储的难题解析

1 对于如下代码,你认为会输出什么?
在这里插入图片描述
结果:
在这里插入图片描述

解析:
[-1]原码:1000 0000 … 0000 0001
[-1]反码:1111 1111 … 1111 1110
[-1]补码:1111 1111 … 1111 1111
整数类型4个字节,字符类型1个字节,往有符号的字符类型a和b中存储发生截断,往无符号字符类型c中存储也发生截断
a: 1111 1111
b: 1111 1111
c: 1111 1111
当以%d打印a,b,c时,它们会发生整形提升(无符号的高位补0,有符号的高位补1).
[a]原: 1111 … 1111 1111
[a]反: 1000 …0000 0000
[a]补: 1000 …0000 0001


[b]原: 1111 … 1111 1111
[b]反: 1000 …0000 0001
[b]补: 1000 …0000 0001


[c]原: 0000 …1111 1111
[c]反: 0000 …1111 1111
[c]补: 0000 …1111 1111
结果即为图片所示


2 对于如下代码,你认为会输出什么?
在这里插入图片描述
结果:
在这里插入图片描述
解析:
[-128]原:1000 … 1000 0000
[-128]反:1111 … 0111 1111
[-128]补:1111 … 1000 0000
把整形类型的数据存入字符类型中,发生整形截断,
[a]: 1000 0000
然后以%u格式(无符号)打印,发生整形提升,a为有符号类型的(看自身类型)
[a]: 1111 1111 … 1000 0000
结果为一个很大的数.


3 对于如下代码,你认为会输出什么?
在这里插入图片描述

结果:
在这里插入图片描述
解析:
[a]原: 0000 … 1000 0000
[a]反: 0000 … 1000 0000
[a]补: 0000 … 1000 0000
发生截断,解析如第2题.


4 对于如下代码,你认为会输出什么?
在这里插入图片描述

结果:
在这里插入图片描述
[i]原:1000 … 0001 0100
[i]反: 1111 … 1110 1011
[i]补: 1111 … 1110 1100
[j]补: 0000 …0000 1010
[i+j]补: 1111 …1111 0110
[i+j]反: 1000 … 0000 1001
[i+j]原: 1000 … 0000 1010
即为-10
结论:
无符号整形i与有符号整形相加,虽然会发生隐式类型转换,但是与运算与类型无关,只是存储在内存中的补码的运算.


5 对于如下代码,你认为会输出什么?
在这里插入图片描述

结果:
在这里插入图片描述
解析:
发生死循环.
当i为9~0时,i >=0;当i为-1时,i中存储的补码为32个1
结论:无符号整形i中结果始终>=0


6 对于如下代码,你认为会输出什么?
在这里插入图片描述

结果:
在这里插入图片描述
i为0~7的截图
在这里插入图片描述
-1-i的结果往字符数组中存储发生整形截断,只能存储低八位,当i为255时,
[-256]原:1000 … 0001 0000 0000
[-256]反: 1111 … 1110 1111 1111
[-256]补:1111 … 1111 0000 0000(低八位)
此时a[255] = ‘\0’,strlen(a) = 255(strlen函数求长度不包括\0)

7 对于如下代码,你认为会输出什么?

在这里插入图片描述

结果 :
在这里插入图片描述
解析:
发生死循环.
当i为256时,
[256]补:0000 … 0001 0000 0000
[i]补: 0000 0000
相当于i每次由0~255后,i又变为0.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值