首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“(无符号)1”与“(无符号)~0”之间的差异

“(无符号)1”与“(无符号)~0”之间的差异
EN

Stack Overflow用户
提问于 2013-09-30 01:21:06
回答 4查看 540关注 0票数 2

(unsigned)~0(unsigned)1的区别是什么?为什么unsigned of ~0-1unsigned of 11?它与无符号数字存储在内存中的方式有关吗?为什么没有符号的数字会给出一个有符号的结果。它也没有产生任何溢出错误。我正在使用GCC编译器:

代码语言:javascript
运行
复制
#include<sdio.h>
main()
{
 unsigned int x=(unsigned)~0; 
 unsigned int y=(unsigned)1; 
 printf("%d\n",x); //prints -1
 printf("%d\n",y); //prints 1
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-30 01:23:30

因为%d是一个有符号的int说明符。使用%u

在我的机器上打印4294967295

正如其他人所提到的,如果您将最高的无符号值解释为签名,则得到-1,请参阅二补的维基百科条目。

票数 6
EN

Stack Overflow用户

发布于 2013-09-30 01:24:01

您的系统使用负数的http://en.wikipedia.org/wiki/Two%27s_complement表示形式。在这种表示法中,由所有二进制数组成的二进制数表示最大负数-1

因为倒置零的所有位会给出一个由所有数字组成的数字,所以当你用一个期望有符号数字而不是无符号数字的%d来重新解释这个数字为一个有符号的数字时,你会得到它。

票数 2
EN

Stack Overflow用户

发布于 2013-09-30 01:38:09

首先,在使用printf时,您告诉它将数字打印为已签名("%d"),而不是无符号("%u")。

其次,您是对的,因为它“与数字存储在内存中的方式有关”。int (签名或无符号)不是计算机上的一个位,而是k位的集合。K的确切值取决于计算机体系结构的具体情况,但很可能您有k=32。

为了简洁起见,让我们假设您的ints有8位长,所以k=8 (当然不是这样,除非您在一个非常有限的嵌入式系统上工作)。在这种情况下,(int)0实际上是00000000,(int)~0 (等于所有位)是11111111。

最后,在两个补码(这是最常见的数字二进制表示)中,11111111实际上是-1。有关两个补语的描述,请参见http://en.wikipedia.org/wiki/Two's_complement。

如果您将打印更改为使用"%u",则它将打印一个表示(2^k-1)的正整数,其中k是整数中的位数(因此很可能它将打印4294967295)。

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

https://stackoverflow.com/questions/19085172

复制
相关文章

相似问题

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