二进位负数必须使用二的补数2's complement
二的补数的定义为 (一的补数+1)
而一的补数定义为 1转成0 0转成1
举例:
3为0011
则一的补数为1100
而二的补数为1100 + 1 = 1101
注意一下如果有n个bit来表达二的补数
则只能表达2^(n-1)这么多种
而范围为 -2^(n-1) ~ 2^(n-1)-1
例如4bits 只能表达 -8 ~ +7
程式写法就先变为正数 转二进位之后
再做not(1转0;0转1)运算 再+1
还原的时候 先判断最高位是否为1
如果是1就代表是负数 反回去算 先减一 再做not 再算回去十进位
如果是0就是正数 直接算回十进位
至于小数就有些麻烦了
先讲解一下十进位的表示方式
12.78
这边是
1*10^1 + 2*10^0 + 7*10^-1 + 8*10^-2
应该看的懂吧
其实每种进位的方式都是依照这个模式
所以1100.101就是
1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 + 1*2^-1 + 0*2^-2 + 1*2^-3
做法..呵呵..我投降..没有纸笔我不太会讲..而且其实我快忘了
还有一种浮点数表示法
就是我们常用的float double之类的
表达方式大概就像科学表示法一样
不过他依然是使用二进位
例: 1111 * 2^10
先看成1.111 * 2^10
然后变成10进位
1.111为1.875
->1.875 * 2^2 = 7.5
他是将一串很长的bit分隔为三段
第一段为sign 他只占了1个bit 值1代表负数 0代表正数
第二段为2的指数部分从负的到正的..负数一样使用二的补数法
第三段为小数部分 就是刚刚的那一段1111
至于怎么分段..IEEE有规定的
32bits的话
左边第1个是sign
往右数2~9是指数部分
最右边的10~32就是小数部分了
64bits为1bit的sign;
11bits的指数;
52bits的小数
浮点数表示法的精确度和他所造成的撷取错误就不再讨论了..
有兴趣翻书吧..
这是电脑里面浮点数的表示法
挺不好懂的..有兴趣的话翻一翻计概的书吧..
这些是我仅存的记忆!!
看看就好..我承认小弟我的表达能力甚差..讲的不是很好请见谅
恩..顺便找到一个网页给大家参考啰..
http://www.csie.ncnu.edu.tw/~s...spro/bcc.html在网页的下半部有讲到数值的表示法..
(看网址好像是暨南大学资工系的某教授课程教材)