如何在32位处理器上使用一个有符号整数和一个无符号整数制作带符号的64位整数
在带32位编译器的32位处理器上我想使用每个有符号和无符号整数中的一个构成64位有符号整数。不使用任何预定义的宏或类型。如何在32位处理器上使用一个有符号整数和一个无符号整数制作带符号的64位整数
32位编译器将为您处理64位数字。所以它不太可能你真的需要这个。但我会咬人。表面上这是一个非常简单的问题。
#include <stdint.h>
static inline int64_t make_int64(uint32_t low, int32_t high) {
return (int64_t)((uint64_t)high << 32) | low;
}
static inline void split_int64(int64_t value, uint32_t *low, int32_t *high) {
*low = value & 0xFFFFFFFF;
*high = (int32_t)((uint32_t)(value >> 32));
}
但它总是棘手/危险的混合有符号和无符号整数。手动构建int也需要您了解处理器如何格式化它们。我们假设它的2s恭维小端。
如果您完整地描述了您的要求,这将会很有帮助。例如上面的例子make_int64(0,-1)= -4294967296,但是make_int64(1,-1)= -4294967295。
如何使用这种方案编码'-1'?和'+ 1'? –
我为你添加了一个匹配的编码器@JonathanLeffler。我所做的只是把64位分成两半。我正在做的唯一奇怪的事情是使用强制转换来防止CPU扩展符号。当然这只适用于存储/检索。如果他想以某种方式操纵split int,他不得不担心endian问题等。 – Richard
你在C中实现编译器吗?你有没有'很久'? –
使用'int64_t'和'' –
BLUEPIXY
顺便说一下,你在做什么?你正在创建一个编译器吗?你正在创建一个Linux设备驱动程序?这与内存对齐有什么关系?还是Arch Linux发行版?不要使用与您的问题无关的标签发送垃圾邮件。 –