我使用以下初始化程序制作了一个程序
int j=35,l;
l=~j;
如果l
打印为%d
,则输出为-36
答案 0 :(得分:4)
按位补码运算符~
将其操作数的所有位取反。因此,假设int
为32位,则二进制值为:
00000000 00000000 00000000 00100011
在应用~
之后成为这个:
11111111 11111111 11111111 11011100
假设负数以二进制补码表示,则该值为-36。
您期望的值222类似于int
的二进制形式:
00000000 00000000 00000000 11011110
因此,您似乎希望只有最低有效字节会被反转,而所有字节中的位都会被反转。
答案 1 :(得分:2)
也许您的意思是220,在这种情况下:
#include <stdio.h>
int main() {
char s = 35;
unsigned char u = 35;
char is = ~s;
unsigned char iu = ~u;
printf("~35 (signed) = %d\n", is);
printf("~35 (unsigned) = %d\n", iu);
return 0;
}
打印位置:
~35 (signed) = -36
~35 (unsigned) = 220
请记住,int
通常为32位或更多,而不是您期望的8位。
答案 2 :(得分:1)
220是无符号值,表示使用8位数据类型存储时的否定值35。
C标准保证 int
至少为 16位,因此您将绝不通过否定{{1 }}包含35。使用int
中的uint8_t
存储35的值及其取反。
还请注意,<stdint.h>
系列函数将printf
和%u
的参数分别提升为%d
和unsigned int
的参数,因此您可能希望将较高的在打印时按位与。