代码陷阱之类型转换


在阅读此文之前,麻烦您点击一下“关注”,既方便您进行讨论和分享,还可以给您带来不一样的参与感,谢谢您的支持。


搭乘C语言的魔幻之旅:0xFF等于0xFF吗?


你是否曾为编写比较代码而苦恼?下面有一个简单的例子:


c

Copy code

int main{

char a = 0xff;

if(a == 0xff) {

printf("same");

} else {

printf("different");

}

}


问题是,这段代码的main函数最终输出是什么?也许答案并不像你想象的那么简单。为了真正理解,让我们先运行一下看看。


结果是:"different"。是的,变量a和0xff是不同的!虽然从源代码看,它们似乎是相同的,但从二进制和十进制的角度来看,它们并不相等。


问题的关键在于类型统一。一般情况下,编译器会将char类型的变量a向int类型转换。但是要注意,因为a是有符号数,它的最高位是1,表示负数,所以它的值是-1,而不是255。另一方面,右边的0xff是一个无符号数(unsigned int),转换成int后仍然是255,显然-1和255是不相等的。


那么,为什么我们经常编写这种代码却没有问题呢?这是因为我们通常使用正数进行比较,这样就可以规避类型歧义的风险。但是,我们不能依赖于运气,应该积极避免这种问题。


解决方法很简单:要么将0xff转换成与a相同的类型,要么将a转换成与0xff相同的类型。只要类型相同,比较结果就是可控的。


总之,负数在二进制中具有二义性,既可以表示正数,也可以表示负数。虽然编译器会发出警告,但由于我们通常使用正数进行比较,这些警告看似毫无意义。但是,我们必须认识到潜在的风险,并解决这些警告,以使我们的代码更可靠。


搞清楚这些编程知识,不妨考虑阅读微软大佬们联袂推荐的《CPU眼里的C/C++》。

展开阅读全文

页面更新:2024-02-05

标签:参与感   类型   代码   正数   负数   编译器   变量   符号   陷阱   风险   简单

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top