gpt4 book ai didi

C++:使用无位移位的指针将无符号字符转换为无符号整数

转载 作者:太空狗 更新时间:2023-10-29 19:45:17 26 4
gpt4 key购买 nike

假设我有一个 unsigned char 类型的 C 风格数组:

unsigned char * c = (unsigned char *) malloc(5000 * sizeof(unsigned char));
for(int i = 0; i < 5000; i++)
c[i] = (unsigned char) ((i >> (i%4 * 8)) & 0xFF);

假设我有一个指针偏移到一个 4 字节整数开始的位置:

// pseudo code
unsigned int i = c + 10; // 10 = pointer offset, let's say.

如果我想用正确的数字加载 i,我可以这样做:

unsigned int i = (*(c+10) << 24) + (*(c+11) << 16) + (*(c+12) << 8) + (*(c+13));

但我不应该能够以某种方式使用强制转换来做到这一点吗?

// pseudo code -- I haven't gotten this to work yet: 

int i = (unsigned int) (*((void *)(c+10));

// or maybe
int i = *((unsigned int*)((void *)(c+10)));

简而言之,将四个字节转换为 C 风格字节数组中的 unsigned int 的最干净、最有效的方法是什么?

最佳答案

执行此操作的正确方法是使用 memcpy:

unsigned int i;
std::memcpy(&i, c + offset, sizeof(unsigned int));

在支持未对齐变量访问的体系结构(如 x86-64)上,这将被优化为简单的指针解引用,但在不支持未对齐访问的系统(如 ARM)上,它将做正确的事情把值(value)拿出来。

例如:https://gcc.godbolt.org/z/l5Px4G .在 gcc for x86 和 arm 之间切换编译器,看看指令的区别。

如果您从某些外部来源获取数据,请记住字节序的概念。您可能必须翻转整数的字节以使值有意义。

关于C++:使用无位移位的指针将无符号字符转换为无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52561302/

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