微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 129 是 8 位数字,在 c++

如何解决为什么 129 是 8 位数字,在 c++

我声明了有符号字符并在其中存储了 129,一个 8 位数字。当将其类型转换为整数并打印结果时,其 -127。我知道它是溢出,但是当您查看 129 的二进制 10000001 时会发生混淆。在有符号字符中,最高有效位保留为符号位,其余 7 位用于存储数字的二进制。根据这个概念,129应该存储为-1。 MSG 代表负号,其余 7 位为 0000001,即为 1。 当 129 的二进制变成 -1 时,为什么 129 变成 -127。

#include <iostream>

using namespace std;

int main() {
    char a=129;
    cout<<(int) a; // OUTPUT IS -127
    return 0;
}

解决方法

你目前对负数的想法是这样的:

  • 00000001 == 1
  • 10000001 == -1
  • 01111111 == 127
  • 11111111 == -127

这意味着您只有整数范围 -127...127 和
你也有两个零。 (00000000 == 0 和 10000000 == -0)

最好的方法就是所谓的二进制补码。对于任何数字 x,您否定二进制表示并加 1 得到 -x。
这意味着:

  • 00000001 == 1
  • 11111111 == -1
  • 01111111 == 127
  • 10000001 == -127
  • 10000000 == -128

这样,只有 00000000 为零,并且您的范围最广 -128...127。
此外,CPU 不需要额外的指令来进行有符号数的加法运算,因为它与无符号数的加减法相同。

你可能想知道,为什么要加 1。没有它,它被称为补码。
https://en.wikipedia.org/wiki/Ones%27_complement

,

当前的每台计算机都以称为二进制补码的格式存储低级有符号整数。

在二进制补码中,MAX_POSITIVE+1 是 MIN_NEGATIVE。

0x00000000 is 0.
0x00....0V is V.
0x01....11 is MAX_POSITIVE
0x10....00 is MIN_NEGATIVE
0x11....11 is -1.

乍一看这很奇怪。

但是,这意味着正数和负数的加法逻辑是相同的。事实上,有符号和无符号数学运算结果是相同的,只是在溢出时,正有符号数变为负数,而无符号正数溢出时会返回到 0。

请注意,在 C++ 中,溢出有符号数是未定义的行为,不是因为硬件捕获它,而是因为通过将其设为 UB,编译器可以自由地假设“将正数加在一起是正数”。但在机器码层面,实现是 2s 补码,C++ 定义了从有符号到无符号的转换遵循 2s 补码假设。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。