(unsigned)~0和(unsigned)1的区别是什么?为什么unsigned of ~0是-1而unsigned of 1是1?它与无符号数字存储在内存中的方式有关吗?为什么没有符号的数字会给出一个有符号的结果。它也没有产生任何溢出错误。我正在使用GCC编译器:
#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
}发布于 2013-09-30 01:23:30
因为%d是一个有符号的int说明符。使用%u。
在我的机器上打印4294967295。
正如其他人所提到的,如果您将最高的无符号值解释为签名,则得到-1,请参阅二补的维基百科条目。
发布于 2013-09-30 01:24:01
您的系统使用负数的http://en.wikipedia.org/wiki/Two%27s_complement表示形式。在这种表示法中,由所有二进制数组成的二进制数表示最大负数-1。
因为倒置零的所有位会给出一个由所有数字组成的数字,所以当你用一个期望有符号数字而不是无符号数字的%d来重新解释这个数字为一个有符号的数字时,你会得到它。
发布于 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)。
https://stackoverflow.com/questions/19085172
复制相似问题