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

Balake

编辑:

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

旧帖子:

因此,我有一个从文件中读取的两个字节的值,想要转换为无符号的short,以便可以使用该数值。

示例代码:

#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

但是à\0还是E0 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(在您的系统上)的范围-128127这很常见。你写myChar[0] = 224;0xE0int带有值文字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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将char转换为short

来自分类Dev

将 char* 转换为 short*

来自分类Dev

在C中将char转换为unsigned short

来自分类Dev

将String转换为Char数组时出错

来自分类Dev

如何将const unsigned short转换为unsigned short?

来自分类Dev

将QString转换为unsigned short int

来自分类Dev

将unsigned int拆分为unsigned char []时出错

来自分类Dev

在C中将unsigned char数组转换为signed short

来自分类Dev

将char转换为short时如何避免0xFF前缀?

来自分类Dev

从char转换为金钱时出错

来自分类Dev

使用格式说明符%d和%u将类型转换〜0转换为(unsigned int)和(unsigned short),对于short产生相同的结果,但对于int产生不同的结果

来自分类Dev

将 void (*)() 转换为 void (*)(unsigned char)

来自分类Dev

将图像转换为 MNIST 格式时出现 unsigned int 溢出错误

来自分类Dev

C#:将字符串转换为由首次出现的char分隔的字典时出错

来自分类Dev

将pinescript v2转换为v3时遇到问题

来自分类Dev

将“ unsigned char *”转换为“ char *”(和字符串)

来自分类Dev

如何将 const char* 转换为 const unsigned char*

来自分类Dev

如何将unsigned int转换为unsigned char数组

来自分类Dev

将float转换为datetime时出错

来自分类Dev

将DICOM转换为JPEG时出错

来自分类Dev

将double转换为int时出错

来自分类Dev

将Object []转换为byte []时出错

来自分类Dev

将float转换为datatime时出错

来自分类Dev

将varchar转换为datetime时出错

来自分类Dev

将jpg转换为pdf时出错

来自分类Dev

将jpg转换为pdf时出错

来自分类Dev

将double转换为BigInteger时出错

来自分类Dev

将kml转换为geojson时出错

来自分类Dev

将int转换为NSNumber时出错

Related 相关文章

热门标签

归档