1735485012 发表于 2013-11-2 15:49:33

原码 反码 补码

为什么8位的有符号数表示的范围是-128-127
我怎么想不通,我认为是-127-127,因为第一位是符号位是0或1,那么余下7位最大也就是127,当第一位是1时,那后七位全是1时,不就表示了最大负数-127嘛?为什么是-128,想不通

1735485012 发表于 2013-11-2 15:50:20

希望,懂的人告诉我,我的这个没学好,现在重新学习补码知识

福禄娃娃 发表于 2013-11-2 22:04:55

本帖最后由 福禄娃娃 于 2013-11-2 22:20 编辑

由于-128的原码用8位无法表示,所以必须扩展到16位去表示,然后对16位的原码计算出16位的反码和补码,最后对16位的补码作低8位的截断,截断的低8位的值就是-128的补码了。// 8位所能表示的 原码 的范围-127到+127
// 8位所能表示的 反码 的范围-127到+127
// 8位所能表示的 补码 的范围-128到+127

// 计算机当中,是规定-128的补码是1000 0000
// 算的时候则需要扩展到16位来算。否则,第8位到底表示符号还是表示数值2的7次方呢?所以,8位就按8位的通常看法来看, -128 的补码是 1000 0000
// 是难以理解的。只能扩展后来看。

// -128 原码 1000 0000 1000 0000
// -128 反码 1111 1111 0111 1111
// -128 补码 1111 1111 1000 0000

// -129 原码 1000 0000 1000 0001
// -129 反码 1111 1111 0111 1110
// -129 补码 1111 1111 0111 1111

int main(int argc, char* argv[])
{
char ch = -129; // warning C4309: 'initializing' : truncation of constant value
char ch2 = -128; // no warning
return 0;
}

注意:由于char能表示的范围是:-128~127,如果将-129赋给char,编译的时候是会产生warning的,并会截断,截断后的值是0x7f(127)。

了呆也!!!! 发表于 2013-11-2 22:59:01

如果是0开头,比如0000 0000就按正常的算法,结果是0
如果首位是1,说明是负整数,则取反加1,比如1000 0000,取反就是0111 1111,加1就是1000 0000,则结果就是2的7次方,就是-128了。

安工小王 发表于 2013-11-3 00:11:36

很详细,不错。

生化蓝 发表于 2013-11-3 03:46:05

如果是-127的话那就少了一个数了

牡丹花下死做鬼 发表于 2013-11-3 07:12:26

8bit最多可以表示2^8 = 256个不同的数字 是吧不解释了
第一位就是最高位是用来表示符号的 (只有非负数和负数)所以应为0属于非负数是吧2^7 = 128 所以非负数
是0~127 负数是-128~-1 即-128~127

ロ觜角丄ǒ金 发表于 2013-11-3 08:15:43

so particular

liuxin8285 发表于 2013-11-3 08:41:27

bu cuo a !!

Sanda_Chang 发表于 2013-11-14 22:46:07

学习学习了!!!!!
页: [1]
查看完整版本: 原码 反码 补码