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带撇号)。
字符表示的字符类型,它可以在目标系统上进行最有效的处理(具有与符号字符或无符号字符相同的表示和对齐方式,但始终是不同的类型)。
我不明白用斜体字写的是什么(我也不确定它对这个问题有多大帮助)。是否有任何隐式转换?
发布于 2020-02-12 13:05:38
为什么符号字符可以持有比127更大的值?
它不能。
char x = 231;这里有一个(隐式的)整数转换: 231是int类型的prvalue,并在转换为char (在您的系统上签名)之前取值-25。您可以要求编译器使用-Wconstant-conversion警告您。
字符表示的字符类型,它可以在目标系统上进行最有效的处理(具有与符号字符或无符号字符相同的表示和对齐方式,但始终是不同的类型)。 我不明白用斜体写的是什么
这与类型可以保存的内容无关,它只确保char、signed char和unsigned char这三种类型具有共同的属性。
发布于 2020-02-12 13:23:55
从C++14 char,if signed,必须是2的补码类型。这意味着它的范围至少是-128到+127。重要的是要知道范围可能大于此,因此假设大于127的数字不能存储在char (如果signed )中是不正确的。使用
std::numeric_limits<char>::max()在你的平台上得到真正的上限。
如果您确实将一个大于此值的值分配给一个char,并且char是signed,那么您的代码的行为就是定义的。通常,这意味着对带符号的char类型来说,这实际上是一种普遍的行为。
还请注意,ASCII是一个7位编码,因此错误地说,任何字符范围0- 127是ASCII。还要注意的是,ASCII并不是C++支持的唯一编码。还有其他人。
最后,不同的类型:即使char是signed,它也是与signed char不同的类型。这意味着代码
int main() {
char c;
signed char d;
std::swap(c, d);
}总是会导致编译错误。
发布于 2020-02-12 13:17:44
char temp = 160;实际上是阴性的。重点是cout支持非ASCII字符,因此它将其解释为非负字符.cout可能在使用之前将其转换为无符号字符(或任何无符号整型)。
如果使用printf并告诉它将其解释为整数,您将看到它是一个负值。
printf("%d\n", temp); // prints -96https://stackoverflow.com/questions/60188955
复制相似问题