【问题标题】:How is this sum equal in unsigned binary and twos complement binary?这个和如何在无符号二进制和二进制补码二进制中相等?
【发布时间】:2017-09-19 23:39:49
【问题描述】:

我正在阅读一本计算机体系结构的书,发现了以下内容:

假设您有一个 8 位单元。所以有 256 个可能的整数值。非负数从 0 到 127。假设二进制补码表示,97 + 45 的和是多少?

无符号显然是 142,你可以用十进制的 97 + 45 来表示,或者:

0110 0001
0010 1101 ADD
--------------
1000 1110

但是当你执行二进制补码时,你会得到这个结果 (1000 1110) 并确定它是负数,因为符号位是 1。然后取它的一个补码:

NOT 1000 1110 = 0111 0001

然后确定它的补码:

0111 0001
0000 0001 ADD
--------------
0111 0010

这个号码是114,但是因为我们的原始号码在符号位中有一个1,所以它是-114

问题:

为什么要费尽千辛万苦找到-114?既然 97 和 45,为什么不把两个正整数之和作为一个无符号值,它适合 8 位单元格的范围(1111 1111255)。只是因为问题要求补码吗?

-114 是否等同于 142?我相信,如果你采用二进制补码数线,你会得到142-256,即-114。从此,我不明白为什么要对两个正值求和,为什么还要使用二进制补码!

【问题讨论】:

    标签: binary twos-complement bit-representation


    【解决方案1】:

    1 的补码意味着翻转所有位,2 的补码意味着取反。所以 8 位的 1 的补码在 255 - x 中有效,而在 256 - x 中则为 2。您可以通过执行 1 的补码并添加 1 来获得 2 的补码结果。

    8 位中的142等于-114。不要对此感到太困惑。

    【讨论】:

    • 因此,如果我声明 int x = 97; int y = 45; int z = x + y;,我会得到 142,即使我从未将任何声明为 unsigned。系统确定我需要的是unsigned加法吗?
    • 您还说 8 位的 142 等于十进制的 -114。但是 1000 1110 在 8 中-但是 unsigned142-114 如果 signed。让我感到困惑的是,如果不使用负值,为什么你会想要 signed 版本。当然这只是一个例子,但你永远不能返回十进制 -114 并说这是 95 + 45 的总和,这是错误的......对吗?
    • @datta int 通常表示 32 或 64 位值。如果您手边有 C/C++ 编译器,请使用 char 再试一次。试试这个:char x=100; x+= 30; cout << (int)x;
    • 即便如此,如果我添加两个正值,我认为它们永远不需要是 signed。只有当我想说添加95 + (-45) 时才需要signed 字节。
    • 这就是大多数编程语言提供unsigned前缀的原因。如何解释数据值由程序员决定。
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多