自学位逻辑运算出有关问题了
自学位逻辑运算出问题了
位逻辑反的运算
#include <stdio.h>
main()
{
int b=34;//赋值,b二进制:00100010
printf("%d\n",~b);//输出
}
按道理b是00100010,那取反变成了11011101,也就是221.为什么执行以后变成了-35?
麻烦讲详细一点
------解决方案--------------------
按道理b是00100010,那取反变成了11011101,也就是221.为什么执行以后变成了-35?
取反后最高位变成了1,按有符号整数解释,就是负数了.
printf("%d", ~b);
是按整数格式打印,又因为b取反后的二进制就是表示的-35,所以打印-35.
如果还不清楚,就要看看补码,反码啊,计算机数的存储方式的知识了.
------解决方案--------------------
int b=34;//赋值,b二进制:00100010
b 是int类型,是32位的,不是8位,所以b的二进制是
0000 0000 0000 0000 0000 0000 0010 0010
取反后是
1111 1111 1111 1111 1111 1111 1101 1101
其数值是上面的二进制补码取反加1 乘负1,则为(34 + 1) * -1 = -35
------解决方案--------------------
先去看看补码以及整数的补码表示相关的知识。
位逻辑反的运算
#include <stdio.h>
main()
{
int b=34;//赋值,b二进制:00100010
printf("%d\n",~b);//输出
}
按道理b是00100010,那取反变成了11011101,也就是221.为什么执行以后变成了-35?
麻烦讲详细一点
------解决方案--------------------
按道理b是00100010,那取反变成了11011101,也就是221.为什么执行以后变成了-35?
取反后最高位变成了1,按有符号整数解释,就是负数了.
printf("%d", ~b);
是按整数格式打印,又因为b取反后的二进制就是表示的-35,所以打印-35.
如果还不清楚,就要看看补码,反码啊,计算机数的存储方式的知识了.
------解决方案--------------------
int b=34;//赋值,b二进制:00100010
b 是int类型,是32位的,不是8位,所以b的二进制是
0000 0000 0000 0000 0000 0000 0010 0010
取反后是
1111 1111 1111 1111 1111 1111 1101 1101
其数值是上面的二进制补码取反加1 乘负1,则为(34 + 1) * -1 = -35
------解决方案--------------------
先去看看补码以及整数的补码表示相关的知识。