[英]Get a 64 bit value with a 32 bit address
我有一个32位的地址
uint32_t ptrToValue;
我希望从这个内存位置获得64位值。
如果我喜欢这个
uint64_t value = *(uint64_t*) ptrToValue;
我收到警告“制作一个不同整数的指针”
我该怎么处理?
使用正确大小的整数类型: intptr_t
。 这是一个完整的类型,保证可以转换为指针和返回。
我有一个32位的地址
可能你的意思是你有一个指向32位(4字节)内存的指针。
uint32_t ptrToValue;
你是这个意思?:
uint32_t * ptrToValue;
当你添加*时,警告应该消失。
正如jogojapan在评论中提到的那样忽略了对齐问题,所以让我解释一下。
如果组合的64位值在64位边界(一个字节地址可被8整除),那么如果你想要转换指针并一次读/写64位就没有问题。 但是,如果不是, 并且您的机器不支持未对齐访问,则会发生不良事件(即程序崩溃)。
如果您希望代码在任何机器上运行(至少那些可以同时存储64位的机器),您将不得不使用联合:
typedef union {
uint32_t b32[2];
uint64_t b64[1];
} bits64;
然后,您可以声明bytes8
类型的变量,并使用b32[0]
和b32[1]
或b64[0]
具体取决于您是要将其解释为32位还是64位值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.