Cout 无符号字符

Posted

技术标签:

【中文标题】Cout 无符号字符【英文标题】:Cout unsigned char 【发布时间】:2020-02-06 13:36:08 【问题描述】:

我正在使用 Visual Studio 2019:为什么这个命令什么都不做?

std::cout << unsigned char(133);

我的编译器确实跳过了它(我使用逐步调试对其进行了验证): 我期望打印à。 下一个命令之前的每个输出都会被忽略,但之前的输出不会。 (std::cout &lt;&lt; "12" &lt;&lt; unsigned char(133) &lt;&lt; "34"; 打印“12”)

我也尝试将其更改为这些:

std::cout << unsigned char(133) << std::flush;
std::cout << (unsigned char)(133);
std::cout << char(-123);

但结果是一样的。

我记得它以前工作过,我的一些使用这个命令的程序已经神秘地停止工作了......在一个空白的新项目中同样的结果!

我认为我的新自定义键盘布局可能是原因,但禁用它并没有太大变化。

在其他在线编译器上它可以正常工作,那么这可能是 Visual Studio 2019 的错误吗?

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

“理智”的答案是:不要依赖扩展的 ASCII 字符。 Unicode 的普及程度足以使其成为首选方法:

#include <iostream>
int main() 
    std::cout << u8"\u00e0\n";

这将显式打印您请求的字符à;事实上,这也是您的浏览器理解它的方式,您可以通过放入例如一些 unicode 字符搜索,将得到 LATIN SMALL LETTER A WITH GRAVE,代码为 U+00E0,您可以在上面的代码中找到。

在您的示例中,使用有符号或无符号字符没有区别;字节值 133 被写入终端,但它解释它的方式可能因机器而异,具体取决于它实际设置为解释它的方式。事实上,在 UTF-8 控制台中,这只是一个错误的 unicode 序列(u"\0x85" 不是有效字符) - 如果您的操作系统切换到 UTF-8,这可能就是您看不到输出的原因。

【讨论】:

谢谢!有效! (即使它打印 Ã 而不是 à)你从哪里得到u8"\xC3\xA0" 代码?我希望能够为其他角色更改它... @stacking 网上有很多表格或搜索引擎(如this one),但你得到Ã这个字符真的很令人费解;让我想知道你是否真的有一个支持 utf-8 的终端......它按预期工作,例如在Coliru. 我认为我没有支持 UTF-8 的终端,因为 Ã 不是 UTF-8 字符,正如我所说的,我可以打印 extended-ascii 字符直到几天前 解决了!我只需要写std::cout &lt;&lt; "\xC3\xA0\n"; 而没有u8u8 是什么意思?) @Foxel 你能把这两个版本都转储到一个文件main &gt; out.txt 看看这些文件里面有什么吗?最好使用一些十六进制转储实用程序。【参考方案2】:

你可以尝试使用static_cast

std::cout << static_cast<unsigned char>(133) << std::endl;

或者

std::cout << static_cast<char>(133) << std::endl;

由于我的所有这些都在工作,因此很难确定问题所在,常识会指向一些配置问题。

【讨论】:

这无济于事。演员只是选择另一个op&lt;&lt;重载。 这里真的不是“尝试”;这是关于了解正在发生的事情并随后编写代码以避免将来出现此类问题。如果你做了一个你并不真正理解的修复,你真的能保证吗? 它不起作用......这只是制作相同演员的另一种方式 @BartekBanachewicz,你是对的,但真的很难理解为什么有些代码昨天可以工作,今天不行,并且在不同机器上的同一个编译器中工作,我完全赞成了解为什么会发生事情,但这真的很奇怪。如果你有什么我很想知道的。 @stacking,我的希望很低,但这是我最好的选择。

以上是关于Cout 无符号字符的主要内容,如果未能解决你的问题,请参考以下文章

有符号char转无符号short

有符号和无符号类型运算

将无符号字符c ++转换为c#

为啥无符号类型没有下溢警告?

为啥无符号短(乘)无符号短转换为有符号整数? [复制]

C++ 隐式转换(有符号 + 无符号)