#include<stdio.h> int main() { char a = -128; printf("%d", a); return 0; }
底层解释:
Char a=-128
10000000000000000000000010000000----原码
11111111111111111111111101111111----反码
11111111111111111111111110000000----补码
对于整形的-128在内存中的存储形式:11111111111111111111111110000000----补码
整形的128在存储到char类型的上面时候发生截断:所以char类型的a在内存中存放的是(从低位开始取):10000000----补码,
因为char默认是有符号的,所以当我以%d(整形的形式)打印的时候进行整形提升,最高位补符号位。
A在内存中的补码变为11111111111111111111111110000000
然后在显示的时候为源码
11111111111111111111111110000000----补码
11111111111111111111111101111111----反码
10000000000000000000000010000000----源码----=-128
所以以%d打印的最终结果为是-128
#include<stdio.h> int main() { char a = -128; printf("%u", a); return 0; }
底层解释:对于char a=-128.
但如果是以%u这个无符号整形的方式去打印的话
对于整形的-128在内存中的存储形式:11111111111111111111111110000000----补码
整形的128在存储到char类型的上面时候发生截断:所以char类型的a在内存中存放的是(从低位开始取):10000000----补码,
a本身为char(默认最高位为符号位,整型提升高位补符号位)整型提升a在内存中的补码变为11111111111111111111111110000000(因为是有符号所以高位补截断后a=10000000高位补符号位1)
因为以%u(无符号整形)打印所以高位1不作为符号位,此时a为正数,源码反码补码相同
11111111111111111111111110000000----补码
11111111111111111111111110000000----反码
11111111111111111111111110000000----源码
因为以无符号%u的方式去打印,所以说对于源码最高位1也要加入计算。
11111111111111111111111110000000----源码转换为无符号十进制整数为4294967168
所以以%d打印的最终结果为是4294967168
在本次关于 char a = -128
以 %d
和 %u
不同格式打印结果的探讨中,我们深入剖析了原码、反码、补码在内存中的存储机制,以及类型转换时截断与整型提升的细节。通过对 %d
有符号整型打印和 %u
无符号整型打印的对比分析,清晰地呈现了 C 语言在处理数据类型和打印格式方面的精妙之处。希望这次分享能帮助大家更深入理解 C 语言相关知识,在编程之路上不断前行。