2017-04-07 93 views
3

在帶32位編譯器的32位處理器上我想使用每個有符號和無符號整數中的一個構成64位有符號整數。不使用任何預定義的宏或類型。如何在32位處理器上使用一個有符號整數和一個無符號整數製作帶符號的64位整數

+1

你在C中實現編譯器嗎?你有沒有'很久'? –

+1

使用'int64_t'和'' – BLUEPIXY

+1

順便說一下,你在做什麼?你正在創建一個編譯器嗎?你正在創建一個Linux設備驅動程序?這與內存對齊有什麼關係?還是Arch Linux發行版?不要使用與您的問題無關的標籤發送垃圾郵件。 –

回答

0

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。

+0

如何使用這種方案編碼'-1'?和'+ 1'? –

+0

我爲你添加了一個匹配的編碼器@JonathanLeffler。我所做的只是把64位分成兩半。我正在做的唯一奇怪的事情是使用強制轉換來防止CPU擴展符號。當然這隻適用於存儲/檢索。如果他想以某種方式操縱split int,他不得不擔心endian問題等。 – Richard