http://blog.csdn.net/LM165678/article/details/77030806 关于C中为什么一个字节表示有符号数范围是[-128-127]spa
-0的原码[1000 0000]便是-128的原码[1 1000 0000]被8位截断后的样子。凡是-0的,其表示的负数便是 高位添加1以后表示的负数值。.net
如:若【1000 0000】表示的是负0,则其实际是【1 1000 0000】所表示的负数,即-128.blog
【新的收获】 对于有符号的整型,以一个字节为例,0~127【0000 0000 ~ 0111 1111】表示的是它们自己,而128~255【1000 0000 ~ 1111 1111】则表示负数(-128 ~ -1),其对应值以下表所示:get
无符号值(至关于计算机中存储的是原码) | 255 | 254 | 253 | 252 | ... | ... | 131 | 130 | 129 | 128 |
有符号值(至关于计算机中存储的是补码)【看法释】 | -1 | -2 | -3 | -4 | ... | ... | -125 | -126 | -127 | -128 |
不难发现规律:上下的绝对值之和等于定值。it
第二行的补码恰好是相应的无符号值的原码table
【解释】将此补码按位取反再加一获得了此负数的绝对值的原码,将最高位换为1即为此负数的原码.一个特例是绝对值的原码最高为已经为1了[即-128的绝对值的原码],此时再高位补上1即为-128的原码class
http://blog.csdn.net/scythe666/article/details/50184273 char c=128;printf("%d",c);问题 解除疑惑扩展
这里记住一点:计算机中用一个字节表示1000 0000的有符号值就至关于 1 10000 0000,即-128.当用4个字节扩展这个值表示有符号的这个值时,扩展为1 0* 1000 0000,即4字节的-128,而后转换为补码就是计算机中的存储值方法
0,计算机存储负值以补码形式存储。计算机
1,正数的 原码,反码,补码都同样。
2,负数的反码: 负数的反码是其绝对值的原码按位取反; 负数的补码:此负数的反码 +1;
例子 | 原码 | 反码 | 补码 | ||
-2 | 10000010 | 11111101 | 11111110 | ||
3, 补码的补码 是原码。由负数的补码按位取反再加一获得的是这个负数的绝对值的原码。由补码推导原码两种方法:1,对此补码求补码,2,此补码 -1而后按位取反(符号位除外)
4,按位非操做的本质:操做数的负值减一。本身推导以下:
正数:
2 | 00000010 | 11111101 | 10000010 | 10000011 |
A | B | D | C |
~A=B(负值的补码,也便是计算机存储负值的形式)
B按位取反(符号位不变) =D(D=-A)
D+ 1 = C(负值的原码) [其实是D-1=C]
即C=D-1=-A-1
负数:
例子 | 原码 | 反码 | 补码 | 按位非 | |
-2 | 10000010 | 11111101 | 11111110 | 00000001 | |
A | B | C | D |
负数以补码C的形式存储,按位非即对此补码操做。由补码的补码等于原码=>C按位取反(符号位不变)+1=A。C按位取反(符号位也改变)+1=-A,因此,D=-A-1。
5,左移运算符(<<): 在数值没有溢出的前提下,左移n位,至关于乘以2的n次方。
这个操做符会将数值的全部位(注意,符号位不会移动,即不会影响操做数的符号位)向左移动指定的位数。向左移后,原数值的右侧会多出空位,左移操做会以0来填充这些空位。例子,2<<5 = 64; -2<<5 = -64;
6,有符号的右移运算符(>>):右移n位,至关于除以2的n次方。
这个操做符会将数值的全部位(注意,符号位不会移动)向右移动指定的位数。向右移后,原数值的左侧会多出空位(具体位置是在符号位右边,数值位左边),有符号的右移操做会用符号位来填充全部空位。
7,无符号的右移(>>>):
这个操做符会将数值的全部位(包括符号位)都向右移动,左侧空出来的位用0填充。对正数来讲,>>>和>>操做符结果相同,可是对于负数来讲就不同了,一般负数的>>>操做结果会是个很大的正数。
8,