为什么在C ++ 11中签名char -127到127的范围?

时间:2015-04-16 09:58:57

标签: c++ c++11

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

  

每个字符在实现使用的字符集中都有一个整数值。例如,   ASCII字符集中'b'的值为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是不可移植的。   不幸的是,对于普通字符的signed或unsigned的选择是实现定义的。   C ++提供了两种类型,答案是明确的:signed char,至少可以保存-127到127的值,以及unsigned char,它至少可以保存0到255的值。

c ++标准离开的补充硬件的可能性是多少?它是否避免在8位中使用+128和-128的相同表示?

2 个答案:

答案 0 :(得分:12)

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

与带符号的幅度表示相同。

答案 1 :(得分:2)

represent signed numbers有几种方法,使用哪种方法取决于CPU的运算单元的硬件。尽管2的补码表示已占主导地位,但C和C ++仍然指出必须支持使用不同表示的旧硬件。

注意signed char可能有更宽的范围,例如-2 31 到2 31 - 1,如果字节是32位开启特定的架构。 -127至127是允许任何合规实施的最小最小值。