首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么符号字符可以持有比127更大的值?

为什么符号字符可以持有比127更大的值?
EN

Stack Overflow用户
提问于 2020-02-12 12:59:49
回答 3查看 935关注 0票数 4
代码语言:javascript
复制
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参考

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-12 13:05:38

为什么符号字符可以持有比127更大的值?

它不能。

代码语言:javascript
复制
char x = 231;

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

字符表示的字符类型,它可以在目标系统上进行最有效的处理(具有与符号字符或无符号字符相同的表示和对齐方式,但始终是不同的类型)。 我不明白用斜体写的是什么

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

票数 10
EN

Stack Overflow用户

发布于 2020-02-12 13:23:55

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

代码语言:javascript
复制
std::numeric_limits<char>::max()

在你的平台上得到真正的上限。

如果您确实将一个大于此值的值分配给一个char,并且charsigned,那么您的代码的行为就是定义的。通常,这意味着对带符号的char类型来说,这实际上是一种普遍的行为。

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

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

代码语言:javascript
复制
int main() {
    char c;
    signed char d;
    std::swap(c, d);
}

总是会导致编译错误。

票数 2
EN

Stack Overflow用户

发布于 2020-02-12 13:17:44

代码语言:javascript
复制
char temp = 160;

实际上是阴性的。重点是cout支持非ASCII字符,因此它将其解释为非负字符.cout可能在使用之前将其转换为无符号字符(或任何无符号整型)。

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

代码语言:javascript
复制
printf("%d\n", temp); // prints -96
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60188955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档