因为计算机能够识别二进制序列,所以计算机会以二进制的形式存储一个数 。对于一个正数,以原码的形式存储。对于负数,以补码的形式存储。
正数的原码,反码,补码相同:
例:1
原码:00000000 00000000 00000000 00000001
反码:00000000 00000000 00000000 00000001
补码:00000000 00000000 00000000 00000001
负数:负数以补码的形式存储(最高位是符号位,1表示负,0表示正)
例:-1
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110(符号位不变,其余位按位取反)
补码:11111111 11111111 11111111 11111111(原码取反再加一)
大端小端:因为计算机存储的最小单位是字节,而一个字节是8个bit位,所以我们将整型4个字节的1表示为:00 00 00 01
例:1
大端形式:00 00 00 01
小端形式:01 00 00 00
通常我们在书写时采用大端形式,而计算机在存储时采用小端存储,我们可以来验证:
union B { int a; char b; }; int main() { union B A; A.a = 1; printf( "%c\n",A.b); system( "pause"); return 0; }
按照小端存储的形式,输出的结果应该是ASCII码为1的值。
二进制与十进制转换:
>>右移:二进制向右移位,正数的话空出来的补0;
例:7>>2=1(注意不能写成7<<-2,这儿是错误的形式)
00000000 00000000 00000000 00000111
00000000 00000000 00000000 00000001
<<左移:空出来的位补0
例:4<<1=8;
00000000 00000000 00000000 00000100
00000000 00000000 00000000 00001000
算术移位和逻辑移位:
只有再对于负数右移时才考虑的一种情况:因为负数的最高位是符号位,所以当向右移时,空出来的位是补0还是补1.
算术移位:空出来的位补1.
逻辑移位:空出的位补0.
具体是算术移位还是逻辑移位,取决于电脑平台,所以当负数右移时其程序不具有移植性。
按位与:针对二进制的每一位进行的运算,同为1才为1,否则为0;
例7&5=5
00000000 00000000 00000000 00000111
00000000 00000000 00000000 00000101
00000000 00000000 00000000 00000101
按位或:针对二进制的每一位进行的运算,至少有一个位为1才为1,否则为0;
例:8|4=12
00000000 00000000 00000000 00001000
00000000 00000000 00000000 00000100
00000000 00000000 00000000 00001100
异或:针对二进制的每一位进行的运算,相同为0,不同为1;
例:7^4=3
00000000 00000000 00000000 00000111
00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000011
取反:针对二进制的每一位进行的运算,1变0,0变1;
00000000 00000000 00011000 00000011
11111111 11111111 11100111 11111100