Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Casting_Char - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,casting,char,C++,Casting,Char,下面的代码位是从字符中提取ASCII代码。 当我转换普通ASCII区域中的字符时,我得到了预期的值。 当我从扩展区域转换英镑和欧元时,我得到一个1的负载,填充我存储字符的INT e、 g.以下各项的输出为: 45(预期的ascii E) FFFFFF80(按预期扩展ascii欧元,但添加了1) 这并没有给我带来什么问题,但我只是想知道为什么会发生这种情况。 这是密码 unsigned int asciichar[3]; string cTextToEncode = "E€"; f

下面的代码位是从字符中提取ASCII代码。 当我转换普通ASCII区域中的字符时,我得到了预期的值。 当我从扩展区域转换英镑和欧元时,我得到一个1的负载,填充我存储字符的INT

e、 g.以下各项的输出为:

45(预期的ascii E) FFFFFF80(按预期扩展ascii欧元,但添加了1)

这并没有给我带来什么问题,但我只是想知道为什么会发生这种情况。 这是密码

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";    
    }
unsigned int-ascichar[3];
字符串cTextToEncode=“E€”;
for(无符号整数i=0;icout根据实现的不同,字符可以是有符号的,也可以是无符号的。在您的例子中,它们似乎是有符号的,因此0x80被解释为-128而不是128,因此当转换为整数时,它将变成0xFFFF80


顺便说一句,这与ASCII无关首先,ASCII中没有欧元(扩展或其他),因为创建ASCII时欧元不存在。但是,一些ASCII友好的8位编码确实支持欧元字符,但转换由源代码编辑器完成(编译器只在编辑器中看到一个恰好代表欧元的字节,但可能完全是另一个字节,比如说,在以色列的计算机上)

第二,
(无符号整数)
cast不提取字符的ASCII编码。它们只是将基础数值
char
类型的值转换为无符号整数。这会导致在转换值为负数时发生奇怪的事情-在编译器上,
char
恰好是
有符号char
,因此字符带有ASC大于127的II值最终为负值
char


您应该先转换为
无符号字符
,然后再转换为
无符号整数

升级有符号值时应小心

将有符号字符提升为有符号整数时,会考虑第一位(符号位)。算法大致如下所示:

1) 如果有
1X-XX-XX-XX
(二进制字符,X-任何二进制数字),则int将是(以24个1开头)
1…1-1X-XX-XX-XX
(二进制)->
0xFFFFFFYY
(十六进制)

2) 如果您有
0X-XX-XX-XX
(二进制),那么您将有(从24个零开始)
0…0-0X-XX-XX
(二进制)->
0x000000YY
(十六进制)


在您的情况下,您希望始终强制执行规则#2。为此,您需要告诉编译器忽略第一位(符号位)。为此,您需要使用无符号字符。

我可能弄错了,但我不认为欧元在扩展ASCII字符编码中:它可能是Windows 1252或8位ISO编码之一。ASCII字符不是
无符号int
s。@David Heffernan:它在ISO-8859-15中。只是想知道,0x80是如何被解释为-128的,是吗与最高有效位有关吗?是的,MSB是有符号字符的符号位。是的,正如harper已经提到的,这是大多数计算机中有符号整数的工作方式,MSB是符号位,请参阅