gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:44:26 24 4
gpt4 key购买 nike

编辑:

阅读评论后,感谢@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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com