c - 将 unsigned char 移动超过 8 位

标签 c endianness unsigned-char

这段代码让我有点困扰:

typedef struct _slink{
    struct _slink* next;
    char type;
    void* data;
}

假设这描述的是一个文件中的链接,其中数据是 4 个字节长,表示一个地址或一个整数(取决于链接的类型)

现在我正在考虑将文件中的数字从小端重新格式化为大端,所以我想做的是在写回文件之前更改字节的顺序,即 对于 0x01020304,我想将它转换为 0x04030201 所以当我写回它时,它的小端表示将看起来像 0x01020304 的大端表示>,我通过将 i'th 字节乘以 2^8*(3-i) 来实现,其中 i 介于 0 和3. 现在这是它的一种实现方式,这里让我感到困扰的是,这是将字节移动超过 8 位..(L 是 _slink* 类型)

int data = ((unsigned char*)&L->data)[0]<<24) + ((unsigned char*)&L->data)[1]<<16) + 
                    ((unsigned char*)&L->data)[2]<<8) + ((unsigned char*)&L->data)[3]<<0)

谁能解释一下为什么这真的有效?没有明确地将这些字节转换为整数开始(因为它们只有 1 个字节,但最多移动 24 位) 提前致谢。

最佳答案

在表达式中使用时,任何小于 int 的整数类型都被提升int 类型。

因此,移位实际上应用于 int 类型的表达式,而不是 char 类型。

关于c - 将 unsigned char 移动超过 8 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62666302/

相关文章:

c++ - C/C++ : Portable way to detect debug/release?

audio - WAV到AIF的转换-记录的AIF之间的差异

kernel - WFP 中标注的 classifyFn 中指定的 IP 地址的字节顺序是什么?

c - 演示长整数的字节顺序

c - 为什么 scanf 会用 0 覆盖之前读取的 unsigned char 变量?

c++ - 使用fopen打开.pak文件并将该文件应用于const unsigned char *(C++)

c++ - 数据包嗅探器只检测发送的数据包

c - 触发 inotify 文件更改事件

objective-c - 如何在 swift 文件中使用 HOST_VM_INFO_COUNT

c - 应用程序运行时时间函数是否处理时区更改