#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.
答案 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)