gpt4 book ai didi

c - 将 char* 转换为 unsigned Short* 并取消引用时字节序列发生变化吗?

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

unsigned short* pname = (unsigned short*)(buf + buf_offset);/*sequence problem?*/
unsigned short pointer_offset = ntohs(*pname) & COMPRESSION_MASK;

这里,buf_offset == 0。buf的内容是[c0] [0c]。但是*pname是[0x0cc0]。问题是什么?谢谢。

最佳答案

正如其他人指出的那样,您发布的代码不可移植。这不仅仅是因为字节序的原因。从 char * 转换为 unsigned Short * 也可能导致 bus errors ,由于无效对齐。此外,unsigned Short 中可能存在填充位,导致程序行为异常,或者 unsigned Short 可能小于或大于“2 个字节”,具体取决于 CHAR_BIT 以及实现的选择。总体问题是类型的内部表示,您可以通过使用无论内部表示如何都表现相同的运算符来避免此问题。也许您的意思是:

unsigned short offset = (unsigned char) buf[0];
offset *= (UCHAR_MAX + 1);
offset += (unsigned char) buf[1];
offset &= COMPRESSION_MASK;

如果您想要大端字节序,则必须明确声明您想要它。通过乘以 buf[0] 并加上 buf[1],我指定 buf[0] 更重要buf[1],因此我明确指定我想要大尾数。乘法和加法在每个 C 实现中的工作原理都是相同的,并且不存在对齐问题。

反转转换:

unsigned char buf[2] = { offset / (UCHAR_MAX + 1), offset % (UCHAR_MAX + 1) };

很高兴看到更多的代码在不关心内部表示的情况下编写!

关于c - 将 char* 转换为 unsigned Short* 并取消引用时字节序列发生变化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15424670/

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