为什么输出-33代表此代码段

时间:2013-12-18 21:09:03

标签: c bit-manipulation code-snippets

#include<stdio.h>

int main()
{
    int a=32;
    printf("%d\n", ~a);  //line 2
    return 0;
}

o/p = -33

实际上在原始片段2中是

 printf("%x\n", ~a);  //line 2

我像

一样解决了它
32 in hex is 20.
0000 0000 0010 0000
now tilde operator complements it
1111 1111 1101 1111 = ffdf.

当我有

时,我很困惑如何解决它
printf("%d\n", ~a);  //line 2 i.e %d NOT %x.

3 个答案:

答案 0 :(得分:1)

您应该使用unsigned说明符打印出%u个整数:

unsigned int a = 32;
printf("%u\n", ~a);

使用%d打印出来并将其视为有符号整数。

您将其视为负数,因为符号位通过二进制否定从0设置为1。

以十六进制数字打印它不会解释符号位,因此在两种情况下都会看到相同的结果。

答案 1 :(得分:1)

在C实现中,与任何编程语言的大多数现代实现一样,有符号整数用two’s complement表示。

在二进制补码中,高位表示负数,值按以下样本编码:

Bits  Decimal
0…011 +3
0…010 +2
0…001 +1
0…000  0
1…111 -1
1…110 -2
1…101 -3

因此,如果位的通常(无符号)二进制值是 n 且高位为零,则表示的值为+ n 。但是,如果高位为1,则表示的值为 n -2 w ,其中 w 为宽度(格式中的位数)。

因此,在无符号32位格式中,32位一般为4,294,967,295。在二进制补码32位格式中,32位一位是4,294,967,295 - 2 32 = -1。

在您的情况下,您拥有的位是1111 1111 1111 1111 1111 1111 1101 1111.在无符号32位格式中,即4,294,967,263。在二进制补码中,它是4,294,967,263 - 2 32 = -33。

答案 2 :(得分:0)