【问题标题】:Why is the range of signed char -127 to 127 in C++11? [duplicate]为什么 C++11 中有符号字符的范围是 -127 到 127? [复制]
【发布时间】:2015-04-16 09:58:56
【问题描述】:

我正在阅读 Bjarne Stroustrup 的C++ 编程语言第 4 版,但我无法完全理解第 141 页中提到的以下段落。

每个字符在实现使用的字符集中都有一个整数值。例如, 'b' 的值在 ASCII 字符集中是 98。这是一个输出整数值的循环 您想输入的任何字符:

void intval()
{
    for (char c; cin >> c; )
        cout << "the value of '" << c << "' is " << int{c} << '\n';
}

符号 int{c} 给出字符 c 的整数值(“我们可以从 c 构造的 int”)。 将 char 转换为整数的可能性提出了一个问题:char 是有符号的还是无符号的? 由 8 位字节表示的 256 个值可以解释为值 0 到 255 或 为值 -127 到 127。不,不是人们可能期望的 -128 到 127:C++ 标准留下了可能性一个互补的硬件,并且消除了一个值;因此,-128 的使用是不可移植的。 不幸的是,普通字符的有符号或无符号选择是实现定义的。 C++ 提供了两种答案明确的类型:signed char,至少可以保存值 -127 到 127,以及 unsigned char,它至少可以保存值 0 到 255。

c++ 标准留下的补码硬件的可能性有多大?是不是要避免8位+128和-128的相同表示?

【问题讨论】:

  • 你查过什么是补码吗? ://
  • 这是一个完全正确的问题,因为一个人的补码级别更低,更适合实际的机器实现或架构。

标签: c++ c++11


【解决方案1】:

使用补码表示的 8 位有符号整数只能具有从 -127 到 -0 以及从 +0 到 +127 的值。那是因为有两种表示零的方法;一个正零和一个负零。

与有符号幅度表示相同。

【讨论】:

    【解决方案2】:

    represent signed numbers有多种方式,具体使用哪种方式取决于CPU运算器的硬件。尽管 2 的补码表示已占主导地位,但 C 和 C++ 仍然强调必须支持使用不同表示的旧硬件。

    请注意,signed char 可能有更宽的范围,例如 –231 到 231 – 1,如果特定的字节是 32 位建筑学。 –127 到 127 是任何合规实施都必须允许的最低限度。

    【讨论】:

    • Byte 和 char 是不同的东西。字节传统上是 8 位,而 char 可以是任何东西,
    • @MaximEgorushkin,但用 C/C++ 的说法,字节和字符本质上是一回事。网络协议规范使用术语“八位字节”以避免任何歧义。
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-12-31
    相关资源
    最近更新 更多