2007-06-06
计算机的二进制带符号运算为什么用0表示正数1表示负数
关键字: jsj
以8b为例对比如下:(谁能给我补补课,说说为什么是正0负1,按照我的理解应该是正1负0更符合人类的思维,前者是进行了一次技术上的mapping了)
正号:0
负号:1
原码:
+1 0 000 0001
-1 1 000 0001
反码:
+1 ...
-1 0 111 1110
补码:
+1 ...
-1 0 111 1111
1+(-1)=0
0 000 0001
0 111 1111
------------
1 000 0000 = (-0)
而如果反过来就会是这样的:
正号:1
负号:0
原码:
+1 1 000 0001
-1 0 000 0001
反码:
+1 ...
-1 1 111 1110
补码:
+1 ...
-1 1 111 1111
1+(-1)=0
1 000 0001
1 111 1111
------------
11 000 0000 = (溢出位 8b考虑为 +0)
正号:0
负号:1
原码:
+1 0 000 0001
-1 1 000 0001
反码:
+1 ...
-1 0 111 1110
补码:
+1 ...
-1 0 111 1111
1+(-1)=0
0 000 0001
0 111 1111
------------
1 000 0000 = (-0)
而如果反过来就会是这样的:
正号:1
负号:0
原码:
+1 1 000 0001
-1 0 000 0001
反码:
+1 ...
-1 1 111 1110
补码:
+1 ...
-1 1 111 1111
1+(-1)=0
1 000 0001
1 111 1111
------------
11 000 0000 = (溢出位 8b考虑为 +0)
- 23:03
- 浏览 (6866)
- 评论 (16)
- 分类: [java]
- 进入论坛
- 发布在 驾驭无形的力量—软件艺法思考 圈子
- 相关推荐
评论
janh
2007-07-22
-1就是减1嘛,想一想00000000减去1应该是多少呢,不够就借位,那就是11111111
birdjavaeye
2007-07-22
补码数中的负数 不是原码表示法负数取反加1,是正数取反加1
birdjavaeye
2007-07-22
引用
一 确信你是对的?OXFF 是1111 1111 是-127 不是-1 -1的原码是 1000 0001 反码是 0111 1110 补码是 0111 1111 用16进制表示是 OX7F 是否你搞混了这几种编码 还是我没理解你的说法?
二 不明白你在说什么 正数 源码 反码 补码 都是本身 你说
”单字节有符号整数,正数部分的取值范围是0x00-0x7F。求补码时取反加1,对应0xFF-0x81。“不理解
补码数,x的相反数,就是x求反再加1
于是-1就等于 1取反再加1就是 00000001 -> 11111110 + 1 = 11111111
-(-1)就是-1取反再加1就是 11111111 -> 00000000 + 1 = 00000001
birdjavaeye
2007-07-22
补码中:
-1是11111111
于是1 + (-1)
00000001
+ 11111111
----------
100000000 (保留8位)
00000000 = 0
补码单字节一共有256个数,没有重复,10000000不是-0,是-128
楼主的设计按照 字节整体运算 的原则是错误的:
1是10000001,那么1+1应该是2,于是:
10000001
+ 10000001
----------
100000010(保留8位)
00000010(2还是-2?)
楼主把符号位0定义为负数,那这个肯定不是2了,矛盾
如果不用整体运算,把符号位单独提出来处理,那就复杂多了
所以,现实的选择只能是符号位0非负1负
而这么设计还有一个好处,就是简化无符号数和有符号数的转换:
0x0 ~ 0x7F 0x80 ~ 0xFF
有符号补码:0 ~ 127 -128 ~ -1
无符号: 0 ~ 127 128 ~ 255
有一半的数是对应的,在已知某个有符号字节实际存放正数时,可以直接当做无符号数用,保持了一定的兼容
-1是11111111
于是1 + (-1)
00000001
+ 11111111
----------
100000000 (保留8位)
00000000 = 0
补码单字节一共有256个数,没有重复,10000000不是-0,是-128
楼主的设计按照 字节整体运算 的原则是错误的:
1是10000001,那么1+1应该是2,于是:
10000001
+ 10000001
----------
100000010(保留8位)
00000010(2还是-2?)
楼主把符号位0定义为负数,那这个肯定不是2了,矛盾
如果不用整体运算,把符号位单独提出来处理,那就复杂多了
所以,现实的选择只能是符号位0非负1负
而这么设计还有一个好处,就是简化无符号数和有符号数的转换:
0x0 ~ 0x7F 0x80 ~ 0xFF
有符号补码:0 ~ 127 -128 ~ -1
无符号: 0 ~ 127 128 ~ 255
有一半的数是对应的,在已知某个有符号字节实际存放正数时,可以直接当做无符号数用,保持了一定的兼容
jianfeng008cn
2007-06-07
jianfeng008cn 写道
程序员一懒就用了 1 来表示 负 是说得通的
程序员一懒就用就用补码 好像没什么道理
反过来 带符号运算 不用补码可以吗?
程序员一懒就用就用补码 好像没什么道理
反过来 带符号运算 不用补码可以吗?
解释下 反过来是 说 ”1表示正 0表示负“ 这种情况下 补码也是必需的
jianfeng008cn
2007-06-07
BirdGu 写道
单字节有符号整数,-1的表示应该是1111 1111 (0xFF),而不是0x7F。
单字节有符号整数,正数部分的取值范围是0x00-0x7F。求补码时取反加1,对应0xFF-0x81。所以所有负数的最高位都是1。
单字节有符号整数,正数部分的取值范围是0x00-0x7F。求补码时取反加1,对应0xFF-0x81。所以所有负数的最高位都是1。
一 确信你是对的?OXFF 是1111 1111 是-127 不是-1 -1的原码是 1000 0001 反码是 0111 1110 补码是 0111 1111 用16进制表示是 OX7F 是否你搞混了这几种编码 还是我没理解你的说法?
二 不明白你在说什么 正数 源码 反码 补码 都是本身 你说
”单字节有符号整数,正数部分的取值范围是0x00-0x7F。求补码时取反加1,对应0xFF-0x81。“不理解
qiezi
2007-06-07
我记得哪看到过了,+0和-0。1000...0000表示+0,0000...0000表示-0,这样也是可以的,为了统一就用0000..0000表示了。
用补码好处是不管有无符号,+和-计算方法都一样,不过*和/还是要区分。
用补码好处是不管有无符号,+和-计算方法都一样,不过*和/还是要区分。
BirdGu
2007-06-07
单字节有符号整数,-1的表示应该是1111 1111 (0xFF),而不是0x7F。
单字节有符号整数,正数部分的取值范围是0x00-0x7F。求补码时取反加1,对应0xFF-0x81。所以所有负数的最高位都是1。
单字节有符号整数,正数部分的取值范围是0x00-0x7F。求补码时取反加1,对应0xFF-0x81。所以所有负数的最高位都是1。
jianfeng008cn
2007-06-07
不仅仅是计算机 数学也一样 开始没有负数的概念,后来有需要了,就需要加个符号来表示负数,这就是个从没有到有的过程 这两符号的后面是数字
jianfeng008cn
2007-06-07
hey hey,
这个需求不恶心的,数学再发展,计算机科学也在发展,这是个很合理的需求。
再说一次,”思想性“,不要老在code的角度想这个问题,也许该看看探索这样的电影来综合下
程序员的思维。
这个需求不恶心的,数学再发展,计算机科学也在发展,这是个很合理的需求。
再说一次,”思想性“,不要老在code的角度想这个问题,也许该看看探索这样的电影来综合下
程序员的思维。
抛出异常的爱
2007-06-07
jianfeng008cn 写道
再想了下 这个问题的其实是前提错掉了 ,按照人来的思维并不是 用1来表示正 就合理了
因为符号是处在和数字不同的层面上了 ,先有了无符号运算也是理所当然,后来要引入无符号运算,
自然得多一个符号出来,原来是没有的 现在需要一个 这就是 从无到有的过程 用1来表示"有" "0"来表示无
又回到了”理所当然“的路上,符号和数字不能在同一个层面上考虑,自然也不能拿数字的含义来表示
思考正负号了。
最近看到某处有人说中国人的二进制使用比西方早了4K多年,”易有太极,是生两仪,两仪生四象,四象生八卦,八卦定极凶,吉凶生大业“,被影响了,嘿嘿
附:生命中不能承受之轻 存在即真理 不停寻找
真理是当时只有汇编,没有C这种高级语言
因为符号是处在和数字不同的层面上了 ,先有了无符号运算也是理所当然,后来要引入无符号运算,
自然得多一个符号出来,原来是没有的 现在需要一个 这就是 从无到有的过程 用1来表示"有" "0"来表示无
又回到了”理所当然“的路上,符号和数字不能在同一个层面上考虑,自然也不能拿数字的含义来表示
思考正负号了。
最近看到某处有人说中国人的二进制使用比西方早了4K多年,”易有太极,是生两仪,两仪生四象,四象生八卦,八卦定极凶,吉凶生大业“,被影响了,嘿嘿
附:生命中不能承受之轻 存在即真理 不停寻找
想要结构化编程都很困难
只好hack这种恶心的需求。
PS:汇编中的一个if else 写出来都会死人的。。。。
jianfeng008cn
2007-06-07
再想了下 这个问题的其实是前提错掉了 ,按照人来的思维并不是 用1来表示正 就合理了
因为符号是处在和数字不同的层面上了 ,先有了无符号运算也是理所当然,后来要引入无符号运算,
自然得多一个符号出来,原来是没有的 现在需要一个 这就是 从无到有的过程 用1来表示"有" "0"来表示无
又回到了”理所当然“的路上,符号和数字不能在同一个层面上考虑,自然也不能拿数字的含义来表示
思考正负号了。
最近看到某处有人说中国人的二进制使用比西方早了4K多年,”易有太极,是生两仪,两仪生四象,四象生八卦,八卦定极凶,吉凶生大业“,被影响了,嘿嘿
附:生命中不能承受之轻 存在即真理 不停寻找
因为符号是处在和数字不同的层面上了 ,先有了无符号运算也是理所当然,后来要引入无符号运算,
自然得多一个符号出来,原来是没有的 现在需要一个 这就是 从无到有的过程 用1来表示"有" "0"来表示无
又回到了”理所当然“的路上,符号和数字不能在同一个层面上考虑,自然也不能拿数字的含义来表示
思考正负号了。
最近看到某处有人说中国人的二进制使用比西方早了4K多年,”易有太极,是生两仪,两仪生四象,四象生八卦,八卦定极凶,吉凶生大业“,被影响了,嘿嘿
附:生命中不能承受之轻 存在即真理 不停寻找
jianfeng008cn
2007-06-07
程序员一懒就用了 1 来表示 负 是说得通的
程序员一懒就用就用补码 好像没什么道理
反过来 带符号运算 不用补码可以吗?
程序员一懒就用就用补码 好像没什么道理
反过来 带符号运算 不用补码可以吗?
抛出异常的爱
2007-06-07
负数+正数
二进制:
-1+1 =0
__11111111
+_00000001
---------------------
__00000000
如果象你说的那样
以前的程序的每个正数前面都 要加个1才能运算。。。。
程序员一懒就想到了用补码
二进制:
-1+1 =0
__11111111
+_00000001
---------------------
__00000000
如果象你说的那样
以前的程序的每个正数前面都 要加个1才能运算。。。。
程序员一懒就想到了用补码
jianfeng008cn
2007-06-07
本着“做不迷信、盲从的国人”的宗旨,继续追问

庄老大 能否说得具体点 举个例子之类的 哪些个规则反过来就遵守不了呢?
庄老大 能否说得具体点 举个例子之类的 哪些个规则反过来就遵守不了呢?
庄表伟
2007-06-06
因为先有无符号运算,后有带符号运算。
后来的规则,要兼容先有的规则。
后来的规则,要兼容先有的规则。
- 浏览: 78774 次
- 性别:

- 来自: 湖州

- 详细资料
搜索本博客
我的相册
旋转 SNV10095
共 1 张
共 1 张
最新评论
-
【Ext学习二】Extjs2 小 ...
//已添加自动播放功能: Ext.onReady(function() ...
-- by jianfeng008cn -
【Ext学习一】Ext 继承函 ...
fins 写道我说的是第一个问题 不是第二个空函数F的问题 我说了啊, 这些问题 ...
-- by jianfeng008cn -
【Ext学习一】Ext 继承函 ...
我搞错了,可以支持inline constructor的原因是: sb = ov ...
-- by sp42 -
【Ext学习一】Ext 继承函 ...
空函数是经典的闭包应用,用来解决继承的问题了 呵呵, 至于 "spp.cons ...
-- by sp42 -
【Ext学习一】Ext 继承函 ...
我说的是第一个问题 不是第二个空函数F的问题
-- by fins






评论排行榜