这段代码让我有点困扰:
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/