正数、负数的补码算法一样
int a=25/-25;
取a的绝对值,转换为二进制即原码,正数的补码就是原码,负数补码就是原码取反,然后加1
数据在计算机中用补码表示
25 (0000 0000 0000 0000 0000 0000 0001 1001)
-25 (1111 1111 1111 1111 1111 1111 1110 0111)
算法:
0000 0000 0000 0000 0000 0000 0001 1001
1111 1111 1111 1111 1111 1111 1110 0110
+ 1
----------------------------------------
1111 1111 1111 1111 1111 1111 1110 0111
位移运算:
“>>”运算符作带符号的位移处理,它作位移处理时,会先将值向右移,并在高位填0,然后将位移后所空出的高位,全部改成原来的最高位的值(代表
正负号的位)。也就是说负的值位移后,仍然是负的值,比如:
25>>2 = 6
0000 0000 0000 0000 0000 0000 0001 1001
0000 0000 0000 0000 0000 0000 0000 0110
-25>>2 = -7
1111 1111 1111 1111 1111 1111 1110 0111
1111 1111 1111 1111 1111 1111 1111 1001 (位移之后的数据)
把二进制转换为整数
1111 1111 1111 1111 1111 1111 1111 1001
0000 0000 0000 0000 0000 0000 0000 0110
+ 1
----------------------------------------
0000 0000 0000 0000 0000 0000 0000 0111
“<<”运算符的所作的也是无符号的位移处理,同样地,它不会将所处理的值的最高位视为正负符号,它作位移处理时,会直接左移并在低位填入0。所
以第二高位以下的位若移到了最高位,该值的正负可能会与原来的不同。
25<<2 = 100
0000 0000 0000 0000 0000 0000 0001 1001
0000 0000 0000 0000 0000 0000 0110 0100
-25<<2 = -100
1111 1111 1111 1111 1111 1111 1110 0111
1111 1111 1111 1111 1111 1111 1001 1100 (位移之后的数据)
把二进制转换为整数
1111 1111 1111 1111 1111 1111 1001 1100
0000 0000 0000 0000 0000 0000 0110 0011
+ 1
----------------------------------------
0000 0000 0000 0000 0000 0000 0110 0100
“>>>”运算符所作的是无符号的位移处理,它不会将所处理的值的最高位视为正负符号,所以作位移处理时,会直接在空出的高位填入0。当我们要作
位移的原始值并非代表数值时(例如:表示颜色图素的值,最高位并非正负号),可能就会需要使用此种无符号的位移。
25>>>2 = 6
0000 0000 0000 0000 0000 0000 0001 1001
0000 0000 0000 0000 0000 0000 0000 0110
-25>>>2 = 1073741817
1111 1111 1111 1111 1111 1111 1110 0111
0011 1111 1111 1111 1111 1111 1111 1001
int a=25/-25;
取a的绝对值,转换为二进制即原码,正数的补码就是原码,负数补码就是原码取反,然后加1
数据在计算机中用补码表示
25 (0000 0000 0000 0000 0000 0000 0001 1001)
-25 (1111 1111 1111 1111 1111 1111 1110 0111)
算法:
0000 0000 0000 0000 0000 0000 0001 1001
1111 1111 1111 1111 1111 1111 1110 0110
+ 1
----------------------------------------
1111 1111 1111 1111 1111 1111 1110 0111
位移运算:
“>>”运算符作带符号的位移处理,它作位移处理时,会先将值向右移,并在高位填0,然后将位移后所空出的高位,全部改成原来的最高位的值(代表
正负号的位)。也就是说负的值位移后,仍然是负的值,比如:
25>>2 = 6
0000 0000 0000 0000 0000 0000 0001 1001
0000 0000 0000 0000 0000 0000 0000 0110
-25>>2 = -7
1111 1111 1111 1111 1111 1111 1110 0111
1111 1111 1111 1111 1111 1111 1111 1001 (位移之后的数据)
把二进制转换为整数
1111 1111 1111 1111 1111 1111 1111 1001
0000 0000 0000 0000 0000 0000 0000 0110
+ 1
----------------------------------------
0000 0000 0000 0000 0000 0000 0000 0111
“<<”运算符的所作的也是无符号的位移处理,同样地,它不会将所处理的值的最高位视为正负符号,它作位移处理时,会直接左移并在低位填入0。所
以第二高位以下的位若移到了最高位,该值的正负可能会与原来的不同。
25<<2 = 100
0000 0000 0000 0000 0000 0000 0001 1001
0000 0000 0000 0000 0000 0000 0110 0100
-25<<2 = -100
1111 1111 1111 1111 1111 1111 1110 0111
1111 1111 1111 1111 1111 1111 1001 1100 (位移之后的数据)
把二进制转换为整数
1111 1111 1111 1111 1111 1111 1001 1100
0000 0000 0000 0000 0000 0000 0110 0011
+ 1
----------------------------------------
0000 0000 0000 0000 0000 0000 0110 0100
“>>>”运算符所作的是无符号的位移处理,它不会将所处理的值的最高位视为正负符号,所以作位移处理时,会直接在空出的高位填入0。当我们要作
位移的原始值并非代表数值时(例如:表示颜色图素的值,最高位并非正负号),可能就会需要使用此种无符号的位移。
25>>>2 = 6
0000 0000 0000 0000 0000 0000 0001 1001
0000 0000 0000 0000 0000 0000 0000 0110
-25>>>2 = 1073741817
1111 1111 1111 1111 1111 1111 1110 0111
0011 1111 1111 1111 1111 1111 1111 1001