C语言整型在内存中的存储练习题详解2(Detailed explanation 2 of the practice questions of the storage in memory for c language )
C语言整型在内存中的存储 练习2 —— 说明以下代码输出结果
1 #define _CRT_SECURE_NO_WARNINGS 1
2 #include <stdio.h>
3
4 int main()
5 {
6 char a = -128;
7 printf("%u\n", a);
8 return 0;
9 }
对于这一道题,需要关注以下几点:
1. a 原是 32bit,但是把它存到 char —— 8bit 中。
2. 打印的时候使用的是 %u —— 打印无符号整型的方式进行打印,因此要进行整型提升。
代码详解:
(1)先写出 -128 在内存中的存储形式,即二进制补码:
-128 原码:10000000 00000000 00000000 10000000 (最高位-1表示负数,其他位表示128)
-128 反码:11111111 11111111 11111111 01111111 (最高位不变,其他位按位取反)
-128 补码:11111111 11111111 11111111 10000000 (反码+1)
当用 char - 8bit 存储本应该是 32bit 表示的 a 时,就会发生截断,截断最低八位存入 a 中,即 a 在内存中的值是 10000000 (十六进制 80),进入调试模式,打开内存窗口可以看出:
(2)当用 %u——打印十进制的无符号数字的方法去打印 a 的时候,需要对 a 进行整型提升。
提升的时候要看变量的类型,因为 a 的类型是 char,所以最高位是符号位,提升的时候,高位全部补符号位1,所以提升之后 a 的值为 11111111 11111111 11111111 10000000
注意,提升之后还是补码,要 printf 出来要算出原码,又因为打印形式是 %u,即认为内存中放的是无符号数,那它的原反补应该相同,所以 a 的原码也是:11111111 11111111 11111111 10000000
使用计算机的程序员功能,就可以看出这个值的大小了。
(3)代码运行结果
以上知识点来自:https://www.bilibili.com/video/BV1q54y1q79w?p=29