c语言整形存储的难题解析
Posted ~千里之行,始于足下~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.
以上是关于c语言整形存储的难题解析的主要内容,如果未能解决你的问题,请参考以下文章