有关隐式类型转换的一个小坑坑

博客探讨了C语言中关于隐式类型转换的一个问题,通过示例代码展示了当char类型的-128转换为无符号int时,由于高位补1导致的意外结果。作者提醒开发者注意这种类型转换可能带来的潜在问题。
摘要由CSDN通过智能技术生成

不废话上代码喽

int main()
{
 char a = -128;
 printf("%u\n", a);
 system("pause");
 return 0;
}

输出结果是什么大家猜猜看
答案就是

oО猜囨箌紦,铟爲挖才煶主角筜嘫煶由挖說出dā荌嘍oo

本次博客就到这,掰!

开玩笑了,正确答案是
在这里插入图片描述
你以为是什么啊,当然就是这一堆堆莫名其妙的数字。其实这堆莫名其妙的数字也没有很莫名奇妙了。可以试着把它转化为二进制来看看

在这里插入图片描述
发现这个数是不是很有规律
1111 1111 1111 1111 1111 1111 1000 0000

让我们来看看到底是为什么会这样:

char a =-128

因为 char 类型变量占一个字节。所以这个 -128 的二进制表示为 1000 0000
但最后是以 %u 的格式来输出,%u就是无符号的 int ,要占四个字节的啊兄弟。这就是C语言中数据的隐式类型转换的一个小坑坑。
变量 a 由一个字节转换为四个字节。高位自动补全为符号位,就是如果是负数高位补1,如果是正数高位补零。比如

int main()
{
 char a = 127;
 printf("%u\n", a);
 system("pause");
 return 0;
}

输出结果仍为 127 因为虽然会隐式转换为 unsigned int 。但由于它为正数,所以高位补0,不会对原来的数值有影响。
具体多余的位为什么要补符号位,很复杂啦有没有人来解释一下,反正我是不明白。到时候明白了再回来说8,掰!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值