复制粘贴的:
C语言按位取反运算符~
注意:C语言的按位取反运算,对于符号位同样取反:如
C语言~12 按位取反的结果 是什么?
short 型为例 12的二进制为0000 1100
取反便成了。1111 0011
而这个数用带符号的整形(%d打印出)表示为-13
------------------------
负数的绝对值等于: 取反 + 1
1111 0011 取反加1为0000 1101 = 13
所以为-13
最高位为符号位
-----------------------------------
printf("%x,%d\n",~7,~7);//输出:fffffff8,-8
源码编译环境、32位机
//.NETCLR规定整型变量默认为int类型,也就是说此处的7在内存中占有4个字节。
00000000 00000000 00000000 00000111(7)
按位取反运算
11111111 11111111 11111111 11111000
printf("%x\n",~7)//十六进制输出:fffffff8
printf("%d\n",~7)//十进制输出 :-8
之所以出现-8在于结果溢出,比如
printf("%u\n",~7)//十进制输出 :4294967288
因此,输出结果为-8在于超过了int的范围
例如:下面两正数相加结果变成了负数.
1)(+72)+(+98)=?
0 1 0 0 1 0 0 0 B +72
+ 0 1 1 0 0 0 1 0 B +98
1 0 1 0 1 0 1 0 B -86
补码的真值
例:-65
原码:11000001
反码:10111110
补码::10111111
若直接将10111111转换成十进制,发现结果并不是-65,而是191。
那么,如何得到其真值呢?
直接按照补码的反过程就行了:
如果要得到一个负二进制数的真值,只要先减1,然后各位取反(不包括符号位)就行了。
二进制值:10111111(-65的补码)
减1
:10111110
各位取反:11000001
此变为结果
~-2
结果是1