首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未签名-1 =签名-1

未签名-1 =签名-1
EN

Stack Overflow用户
提问于 2016-12-03 06:58:30
回答 1查看 1.2K关注 0票数 0

已经问了不少类似的问题,但我还是很困惑。

代码语言:javascript
复制
unsigned int a = -1;
int b = ~0;
if (a == b)
    printf("%u\t%d", a, b);

返回

4294967295 -1

我理解这些值是如何存储在C中的,以及为什么它会显示这些数字,但我的问题是,a==b是如何在这里返回true的?

EN

回答 1

Stack Overflow用户

发布于 2016-12-03 07:09:24

根据混合符号-无符号比较规则,a == b等价于a == (unsigned) b,即在无符号类型域中执行比较。

~0的结果是全一位模式.在有符号整数类型中,此模式表示2‘s补码平台上的-1。这意味着您使用b初始化了-1 (如您的printf所确认的)。

因此,您的比较实际上是(unsigned) -1 == (unsigned) -1。难怪这是真的。

但是请记住,等式仍然是依赖于实现的,因为它依赖于2s-补表示的属性。只要C语言正式支持可选的有符号整数表示(符号和大小,1‘s-补码),等式就取决于它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40945150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档