为什么签名字符可以保存大于 127 的值?

Why signed char can hold bigger values than 127?

本文关键字:大于 的值 保存 字符 为什么      更新时间:2023-10-16
int main()
{
char MCU = 0b00000000;
char al_av = 0b10100000;
// Before bit operation
cout << "MCU = " << int(MCU) << endl;
MCU = MCU | al_av;
// After the bit operation
cout << "MCU = " << int(MCU) << endl;   // Expected 160, got -96
char temp = 160;
cout << temp;   // got the a with apostrophe
return 0;
}

我预计char temp的输出是负数(或警告/错误(,因为 160 超过了 [-127,127] 间隔,但相反,结果是 ASCII 表中的结果(带撇号的 a(

关于 cpp 参考:

char - 用于在目标系统上最有效地处理的字符表示形式(与有符号字符或无符号字符具有相同的表示形式和对齐方式,但始终是不同的类型(

我不明白斜体写的是什么(我也不确定它对这个问题有很大帮助(。是否有任何隐式转换?

为什么有符号字符可以容纳大于 127 的值?

不能。

char x = 231;

这里,有一个(隐式(整数转换:231 是int类型的PR值,在转换为char(在您的系统上签名(之前获取值-25。您可以要求编译器使用-Wconstant-conversion警告您。


char - 可以在目标系统上最有效地处理字符表示的类型(具有与有符号字符或无符号字符相同的表示和对齐方式,但始终是不同的类型(

我不明白斜体写的是什么

这与类型可以保存的内容无关,它只确保三种类型charsigned charunsigned char具有共同的属性。

从 C++14char开始,如果signed,必须是 2 的补码类型。这意味着它的范围至少为 -128 到 +127。重要的是要知道范围可能大于此范围,因此假设大于 127 的数字不能存储在char中是不正确的,如果signed。用

std::numeric_limits<char>::max()

以获得您平台上的真正上限。

如果您确实将大于此值的值分配给char并且charsigned则代码的行为是实现定义的。通常,这意味着环绕到负数,这实际上是有符号char类型的普遍行为。

另请注意,ASCII 是 7 位编码,因此说 0 - 127 范围之外的任何字符都是 ASCII 都是错误的。另请注意,ASCII 并不是 C++ 支持的唯一编码。还有其他的。

最后,不同的类型:即使charsigned,它也与signed char是不同的类型。这意味着代码

int main() {
char c;
signed char d;
std::swap(c, d);
}

将始终导致编译错误。

char temp = 160;

它实际上是负面的。关键是cout支持非ASCII字符,因此它将其解释为非负数。cout 可能在使用它之前将其转换为无符号字符(或任何无符号整数类型(。

如果您使用 printf 并告诉它将其解释为整数,您将看到它是一个负值。

printf("%dn", temp); // prints -96