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

Sho*_*rma 6 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';
}
Run Code Online (Sandbox Code Playgroud)

符号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的相同表示?

gna*_*729 12

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

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