目录
一、整型数据以补码的形式在内存中存储
内存中存储的是补码 。整型在内存中以二进制补码的形式存储,不过为了方便,以16进制显示。
1. 原反补码转换
二进制最高位是符号位。最高位的1表示负数,0表示正数。
原码 --- 取反--->反码 --- +1--->补码 注意:取反时,符号位不变
补码 --- -1--->反码 --- 取反--->原码
补码 --- 取反--->反码 --- +1--->原码
例如:负数-1
2.二进制补码计算
内存中存储的是补码(计算用的也是补码),打印的是原码。
如果为char、short类型数据相加,需要进行隐式类型转换,详情可见整型提升
3.有符号与无符号类型数据的取值范围
例题:这道题输出结果?
答案:无符号整型>=0恒成立,所以程序会死循环
二、大小端字节序
在文章开头的内存截图中,数据02 00 00 00倒着放。为什么呢?这涉及到大小端字节序的问题。
助记小课堂:
注意事项: 大端小端是字节序。既然是字节之间的顺序,只有>1的数据类型才会讨论字节序。char类型是不存在字节序的。
例题:
三、整型数据存储练习题
练习提示:从第四题开始会涉及整型提升的知识,相关文档链接在本篇文章开头~
🙋🏻♂️例题1:这道题输出结果是多少?
分析:
答案:10
🙋🏻♂️例题2:这道题输出结果是多少?
分析:
答案:无限循环
🙋🏻♂️例题3:这道题输出结果是多少?
分析:
答案:a = b = -1 ; c = 255
🙋🏻♂️例题4:输出结果是多少?
分析:
答案:4294967168
🙋🏻♂️例题5:这两个程序的输出结果相同吗?
分析:
第一个程序 -128 第二个程序 128
原码 10000000 00000000 00000000 10000000 00000000 00000000 00000000 10000000
反码 11111111 11111111 11111111 01111111 01111111 11111111 11111111 01111111
补码 11111111 11111111 11111111 10000000 01111111 11111111 11111111 10000000
①存储在char类型中 -> 截断得10000000 ①存储在char类型中 -> 截断得10000000
②%u 输出整数 -> 整型提升 ②%u 输出整数 -> 整型提升
char默认有符号char 高位补符号位 char默认有符号char 高位补符号位
补码 11111111 11111111 11111111 10000000 11111111 11111111 11111111 10000000
原反补相同,补码就是原码
答案:输出相同
🙋🏻♂️例题6:输出结果是多少?
分析:
strlen停止的标志是0。所以需要先找到,数字减为0的情况,再计算总共有多少数。
-i 就是⚪左边的数字。-i-1就是黄色箭头逆时针循环。-1-1=-2 ➡ -2-1=-3...➡ -128-1=127 ➡ 1-1=0
🙋🏻♂️例题7:输出结果是多少?
分析:这个跟前面的第2题是类似的。0<=无符号取值范围<=255 恒成立
答案:死循环输出hello world