在C++中查看ASCII代码时出现意外结果

Col*_*mbo 2 c++ casting char

下面的代码位是从字符中提取ASCII代码.当我在普通的ASCII区域中转换字符时,我得到了我期望的值.当我从扩展区域转换£和€时,我得到一个1的填充INT,我正在存储该字符.

例如,以下的输出是:

45(ascii E如预期)FFFFFF80(按预期延长ascii€但用垫填充)

这不是一个问题,但我只是想知道为什么会这样.这是代码......

unsigned int asciichar[3];
    string cTextToEncode = "E€";
    for (unsigned int i = 0; i < cTextToEncode.length(); i++)
    {
        asciichar[i] = (unsigned int)cTextToEncode[i];
        cout << hex << asciichar[i] << "\n";    
    }
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么会这样?谢谢

wic*_*ich 7

根据实现,char可以是signed或unsigned.在您的情况下,它们似乎是有符号的,因此0x80被解释为-128而不是128,因此当转换为整数时,它变为0xffffff80.

顺便说一句,这与ASCII没什么关系


Vic*_*let 5

首先,ASCII(扩展或其他)没有€,因为创建ASCII时欧元不存在.但是,几个支持ASCII的8位编码确实支持€字符,但转换是由源代码编辑器完成的(编译器只看到一个字节恰好代表编辑器中的€,但可能完全是其他东西,比如,以色列的一台电脑).

其次,(unsigned int)强制转换不提取字符的ASCII编码.它们只是将基础数值char类型的值转换为无符号整数.当转换后的值为负时,这会导致奇怪的事情发生 - 在编译器上char恰好是这样signed char,因此ASCII值大于127的字符最终为负值char.

你应该转换为unsigned char第一个,然后转换为unsigned int.