论坛首页 入门技术论坛

计算机的二进制带符号运算为什么用0表示正数1表示负数

浏览 19949 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-06-06   最后修改:2009-06-02

以8b为例对比如下:(谁能给我补补课,说说为什么是正0负1,按照我的理解应该是正1负0更符合人类的思维,前者是进行了一次技术上的mapping了)


正号:0
负号:1

原码:
+1 0 000 0001
-1 1 000 0001

反码:
+1 ...
-1 1 111 1110

补码:
+1 ...
-1 1 111 1111


1+(-1)=0

  0 000 0001
  1 111 1111
------------
10 000 0000  = (+0)


而如果反过来就会是这样的:

正号:1
负号:0

原码:
+1 1 000 0001
-1 0 000 0001

反码:
+1 ...
-1 0 111 1110

补码:
+1 ...
-1 0 111 1111


1+(-1)=0

1 000 0001
0 111 1111
------------
10 000 0000  = (溢出位 8b考虑为 +0)


20090601
相关链接:
http://dev.csdn.net/develop/article/17/17680.shtm


逆向推理:

先有正数运算,再有负数,才会产生有符号运算所遇到的问题。
按照离散数学的原理,需要解决的问题有两个:
1、负0怎样才能和正0具有相同的标志;
2、其他负数如何确定各自的标志;
3、运算规律是否可行;

下面给出我的推导过程及最后的公式,我觉得 原码和反码的转换公式要比以前我看到的教程简单很多。
一、拿二位10进制为例
可得排列组合(标志)为00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19 共计2*10^1 = 20 个数,为正数1~9 、 0 、和负数10个。(因为正数和0在负数概念出现以前已经确定,所以剩下的数为负数)。


二、拿二位2进制为例
同理有标志00 01 10 11,00为+0,01为+1,推理另两个标志对应的负数。

 


结论

同样的方法可以放到三位二进制 ,四位二进制等,表示为x位n进制可得到公式:
负数原码和补码的转换公式:
1v = -(n^(x-1)-v)
放到8位2进制即:

1v=-(2^7-v)


代入8位二进制即使
1000 0000 = - (2^7-0)= -128;
1000 0001 = -(2^7-1) = -127;
1000 0002 = -(2^7-2) = -126;
...
1111 1111 = -(2^7-(2^7-1)) = -1;

 

"-1就是减1嘛,想一想00000000减去1应该是多少呢,不够就借位,那就是11111111"

这句话同样体现了前提:不破坏先前的正数(包括0)的运算法则。

 

结:那些计算机教材写得真垃圾啊,就这么简单的问题搞锤子求反+1 ,基本上无逻辑可言。

结合离散等数学知识,这个问题是不是可以延伸到内存寻址等相关方面呢?

 

   发表时间:2007-06-06  
因为先有无符号运算,后有带符号运算。

后来的规则,要兼容先有的规则。
0 请登录后投票
   发表时间:2007-06-07  
本着“做不迷信、盲从的国人”的宗旨,继续追问

 

庄老大 能否说得具体点 举个例子之类的 哪些个规则反过来就遵守不了呢?
0 请登录后投票
   发表时间:2007-06-07  
负数+正数
二进制:
-1+1 =0

__11111111
+_00000001
---------------------
__00000000

如果象你说的那样
以前的程序的每个正数前面都 要加个1才能运算。。。。
程序员一懒就想到了用补码
0 请登录后投票
   发表时间:2007-06-07  
程序员一懒就用了 1 来表示 负 是说得通的
程序员一懒就用就用补码 好像没什么道理
反过来 带符号运算 不用补码可以吗?
0 请登录后投票
   发表时间:2007-06-07  
再想了下 这个问题的其实是前提错掉了 ,按照人来的思维并不是 用1来表示正 就合理了
因为符号是处在和数字不同的层面上了 ,先有了无符号运算也是理所当然,后来要引入无符号运算,
自然得多一个符号出来,原来是没有的 现在需要一个 这就是 从无到有的过程 用1来表示"有" "0"来表示无
又回到了”理所当然“的路上,符号和数字不能在同一个层面上考虑,自然也不能拿数字的含义来表示
思考正负号了。
最近看到某处有人说中国人的二进制使用比西方早了4K多年,”易有太极,是生两仪,两仪生四象,四象生八卦,八卦定极凶,吉凶生大业“,被影响了,嘿嘿
附:生命中不能承受之轻 存在即真理 不停寻找 
0 请登录后投票
   发表时间:2007-06-07  
jianfeng008cn 写道
再想了下 这个问题的其实是前提错掉了 ,按照人来的思维并不是 用1来表示正 就合理了
因为符号是处在和数字不同的层面上了 ,先有了无符号运算也是理所当然,后来要引入无符号运算,
自然得多一个符号出来,原来是没有的 现在需要一个 这就是 从无到有的过程 用1来表示"有" "0"来表示无
又回到了”理所当然“的路上,符号和数字不能在同一个层面上考虑,自然也不能拿数字的含义来表示
思考正负号了。
最近看到某处有人说中国人的二进制使用比西方早了4K多年,”易有太极,是生两仪,两仪生四象,四象生八卦,八卦定极凶,吉凶生大业“,被影响了,嘿嘿
附:生命中不能承受之轻 存在即真理 不停寻找 
真理是当时只有汇编,没有C这种高级语言
想要结构化编程都很困难
只好hack这种恶心的需求。
PS:汇编中的一个if else 写出来都会死人的。。。。
0 请登录后投票
   发表时间:2007-06-07  
hey hey,

这个需求不恶心的,数学再发展,计算机科学也在发展,这是个很合理的需求。

再说一次,”思想性“,不要老在code的角度想这个问题,也许该看看探索这样的电影来综合下

程序员的思维。

0 请登录后投票
   发表时间:2007-06-07  
不仅仅是计算机 数学也一样 开始没有负数的概念,后来有需要了,就需要加个符号来表示负数,这就是个从没有到有的过程 这两符号的后面是数字
0 请登录后投票
   发表时间:2007-06-07  
单字节有符号整数,-1的表示应该是1111 1111 (0xFF),而不是0x7F。

单字节有符号整数,正数部分的取值范围是0x00-0x7F。求补码时取反加1,对应0xFF-0x81。所以所有负数的最高位都是1。

0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics