我正在阅读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的相同表示?
答案 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是允许任何合规实施的最小最小值。