目录
在了解按位取反符号(~)怎么用之前,需要简单明白什么是原码、反码、补码。
①原码、反码、补码驿站
原码:数值在当前数据类型的二进制形式
前方高能:
a:原码的最高位表示符号位:0为正数,1为负数;
b:正数的原码 = 反码 = 补码;
c:printf打印出的是原码;
例:
int a=5,a的原码为:00000000 00000000 00000000 00000101
int b=-5,b的原码为:10000000 00000000 00000000 00000101
char c=5,c的原码为:00000101
小提示:我这里增加一个char型,为了一些小伙伴不清楚为什么这里int型的二进制这么‘长’,char型 二进制这么‘短’;其中原因是int型占空间4字节,char型占空间1字节。不懂小伙伴去查一查哦。
反码: 将数值原码按位取反,符号位不变
上面已讲正数的原码 = 反码 = 补码,所以这里反码讲的主要是负数。
例:接上面例子
int b=-5,b的反码为:11111111 1111111 1111111 11111010
补码:将数值的反码 +1
a:同样的正数的原码 = 反码 = 补码
b:计算机存储的方式为补码;
例:接上面例子
int b=-5,b的补码为:11111111 1111111 1111111 11111011
②按位取反符号(~)运用
咋们在驿站补充了一下基础知识后,就可以简单运用按位取反符号啦!!!
直接上栗子!
例:
char a=0;
char b=~a;
printf('%d\n',b);
->b=-1
解析:a=0为char型,所以a的原码为00000000,a的补码为00000000(正数的原码、反码、补码一致)。因为计算机存储的数据方式计为补码,所以a中存储的二进制是补码00000000。b=~a,即按位取反(就是补码a的按位取反),b是补码11111111。而printf打印出的是原码,所以需要将b的补码转换为原码(原码、反码、补码之间关系上面已讲)。b的补码->反码:11111110,b的反码->原码:10000001。即b=-1
一只可怜虫只是将自己想法分享一下,不对的地方望大佬指正!!!