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

 

posted @ 2022-05-17 18:01  ttweixiao9999  阅读(25)  评论(0编辑  收藏  举报