该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-07
我记得哪看到过了,+0和-0。1000...0000表示+0,0000...0000表示-0,这样也是可以的,为了统一就用0000..0000表示了。
用补码好处是不管有无符号,+和-计算方法都一样,不过*和/还是要区分。 |
|
返回顶楼 | |
发表时间:2007-06-07
BirdGu 写道 单字节有符号整数,-1的表示应该是1111 1111 (0xFF),而不是0x7F。
单字节有符号整数,正数部分的取值范围是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。“不理解 |
|
返回顶楼 | |
发表时间:2007-06-07
jianfeng008cn 写道 程序员一懒就用了 1 来表示 负 是说得通的
程序员一懒就用就用补码 好像没什么道理 反过来 带符号运算 不用补码可以吗? 解释下 反过来是 说 ”1表示正 0表示负“ 这种情况下 补码也是必需的 |
|
返回顶楼 | |
发表时间: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 有一半的数是对应的,在已知某个有符号字节实际存放正数时,可以直接当做无符号数用,保持了一定的兼容 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2007-07-22
补码数中的负数 不是原码表示法负数取反加1,是正数取反加1
|
|
返回顶楼 | |
发表时间:2007-07-22
-1就是减1嘛,想一想00000000减去1应该是多少呢,不够就借位,那就是11111111
|
|
返回顶楼 | |