c++ - 将 char[2] 转换为 unsigned short 时出错?

标签 c++ type-conversion byte short endianness

编辑:

阅读评论后,感谢@M.M 和@AnttiHaapala 我修复了我的代码,但仍然得到不正确的输出...

新代码:

#include <iostream>
int main() {
    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;
    return 0;
}

输出:

65504

或者如果你颠倒顺序

57344

旧帖:

所以我有一个从文件中读取的两字节值,我想将其转换为无符号短整型,以便我可以使用该数值。

示例代码:

#include <iostream>
int main() {
    char myChar[2];
    myChar[1] = 'à';
    myChar[0] = '\0';
    unsigned short myShort;
    myShort = ((myChar[1] << 8) | (myChar[0]));
    std::cout << myShort << std::endl;
    return 0;
}

输出:

40960

但是 à\0E0 00 的值应该是 224 作为无符号的两字节值吗?

也很有趣...

这段代码:

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

最佳答案

注意:原始代码有一个复杂的因素,因为源代码是 UTF-8 编码的。请检查此答案的编辑历史以查看我对此的评论。但是我认为这不是您要问的主要问题,因此我更改了答案以仅解决编辑问题。为避免 UTF-8 转换问题,请使用 '\xE0'而不是 'à' .


关于修改后的代码:

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;

范围char (在您的系统上)是 -128通过127 .这很常见。你写 myChar[0] = 224; . ( 0xE0 是一个 int 值为 224 的文字)。

这是一个超出范围的转换,它会导致实现定义的行为。最常见的是,实现将定义它以调整模 256 直到值在范围内。所以你最终得到与以下相同的结果:

myChar[0] = -32;

然后计算(myChar[1] << 8) | myChar[0]0 | (-32) ,即 -32 .最后,您转换为 unsigned short .这是另一个超出范围的转换,因为 unsigned short 的范围是[0, 65535]在您的系统上。

但是,无符号类型的超出范围转换明确定义为调整模 65536在这种情况下,结果是 65536 - 32 = 65504 .


颠倒顺序执行 ((-32) << 8) | 0 .向左移动一个负值会导致未定义的行为,尽管在​​您的系统上它已表现为执行 -32 * 256 , 给出 -8192 .将其转换为 unsigned short给出 65536 - 8192 = 57344 .


如果你想得到 224从第一个示例开始,最简单的方法是使用 unsigned char而不是 char .那么myChar[0]将保持值 224而不是值 -32 .

关于c++ - 将 char[2] 转换为 unsigned short 时出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36214108/

相关文章:

c++ - 如何进行while循环但有更多条件C++

c++ - 为什么靶心代码覆盖率不跟踪继承类的纯虚函数?

c++ - 将字符串数组转换为 int 数组

c - 通过引用将字节加载到 C 字符串中

python - 使用 python3 从 urllib 解码字节,有更好的方法吗?

c++ - 在定义的时间后退出 C++ 循环

c++ - std::scientific 是否总是导致 float 的规范化科学计数法?

string - 表示小时的格式字符串为 H :MM in output

java - 告诉编译器一个 <Object> 等价于它想要的 <?>

python - 如何使用作为环境变量生成的 PyNaCl key