C++ 将字符[2]转换为无符号短字符时出错? 编辑:

C++ 将字符[2]转换为无符号短字符时出错? 编辑:,c++,type-conversion,byte,short,endianness,C++,Type Conversion,Byte,Short,Endianness,在阅读了评论之后,感谢@M.M和@AnttiHaapala,我修复了我的代码,但仍然得到了错误的输出 新代码: 或者如果你颠倒顺序 57344 旧职位: 所以我有一个两字节的值,我从一个文件中读取,我想转换成一个无符号的短字符,这样我就可以使用这个数值了 示例代码: 但是作为无符号的两字节值,a\0或E0 00的值应为224 也很有趣 此代码: 注意:原始代码有一个复杂的因素,因为源代码是UTF-8编码的。请检查此答案的编辑历史记录以查看我对此的评论。然而,我认为这并不是你要问的主要问题,所以

在阅读了评论之后,感谢@M.M和@AnttiHaapala,我修复了我的代码,但仍然得到了错误的输出

新代码:

或者如果你颠倒顺序

57344
旧职位: 所以我有一个两字节的值,我从一个文件中读取,我想转换成一个无符号的短字符,这样我就可以使用这个数值了

示例代码:

但是作为无符号的两字节值,a\0或E0 00的值应为224

也很有趣

此代码:

注意:原始代码有一个复杂的因素,因为源代码是UTF-8编码的。请检查此答案的编辑历史记录以查看我对此的评论。然而,我认为这并不是你要问的主要问题,所以我改变了我的答案,只是针对编辑。为避免UTF-8转换问题,请使用“\xE0”而不是“a”

关于编辑的代码:

char * myChar;
myChar = new char[2];
myChar[1] = 0x00;
myChar[0] = 0xE0;
unsigned short myShort;
myShort = ((myChar[1] << 8) | (myChar[0]));
std::cout << myShort << std::endl;
然后计算myChar[1]注意:原始代码有一个复杂的因素,因为源代码是UTF-8编码的。请检查此答案的编辑历史记录以查看我对此的评论。然而,我认为这并不是你要问的主要问题,所以我改变了我的答案,只是针对编辑。为避免UTF-8转换问题,请使用“\xE0”而不是“a”

关于编辑的代码:

char * myChar;
myChar = new char[2];
myChar[1] = 0x00;
myChar[0] = 0xE0;
unsigned short myShort;
myShort = ((myChar[1] << 8) | (myChar[0]));
std::cout << myShort << std::endl;

然后计算myChar[1]当您将字符存储到myChar中时,您将以大端存储它:首先是高位字节,然后是低位字节。当您读出单个字节时,您将它们作为小端字节读取:低字节优先,高字节第二移位8,或乘以256。这就是为什么你得到这么大的价值

myShort = (myChar[0] * 256) + myChar[1];

将给您预期的答案。

当您将字符存储到myChar中时,您将其存储为大端:首先是高字节,然后是低字节。当您读出单个字节时,您将它们作为小端字节读取:低字节优先,高字节第二移位8,或乘以256。这就是为什么你得到这么大的价值

myShort = (myChar[0] * 256) + myChar[1];

将为您提供预期的答案。

使用无符号类型进行位级操作

例如,在具有8位字节的计算机上,如果char是有符号的,则myChar[0]=0xE0将导致负值。在表达式中使用时,它是符号扩展


相反,为了避免问题,请对数字使用有符号类型。

对位级操作使用无符号类型

例如,在具有8位字节的计算机上,如果char是有符号的,则myChar[0]=0xE0将导致负值。在表达式中使用时,它是符号扩展


相反,为了避免出现问题,请对数字使用有符号类型。

您的问题不是关于小端和大端数字的CRead。x86处理器是小字节。@ AnttiHaapala,这显然是C++代码。@ῥεῖ 这就是我删除[C]标记的原因……40960的输出表明您使用了160的字符代码,这对我来说是a。您的问题不是关于小端和大端数字的CRead。x86处理器是小字节。@ AnttiHaapala,这显然是C++代码。@ῥεῖ 这就是我删除[C]标记的原因……40960的输出表明您使用了160的字符代码,这对我来说是a。
include <iostream>
int main() {
    char * myChar;
    myChar = "\0à";
    unsigned short myShort;
    myShort = ((myChar[1] << 8) | (myChar[0]));
    std::cout << myShort << std::endl;
    return 0;
}
49920
char * myChar;
myChar = new char[2];
myChar[1] = 0x00;
myChar[0] = 0xE0;
unsigned short myShort;
myShort = ((myChar[1] << 8) | (myChar[0]));
std::cout << myShort << std::endl;
myChar[0] = -32;
myShort = (myChar[0] * 256) + myChar[1];