《从底层深入剖析:char a=-128 在 % d 与 % u 打印下的奇妙之旅》

#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 语言相关知识,在编程之路上不断前行。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值