2017-03-11 100 views
0

我需要表示一個128位無符號整數並將其傳遞給原型爲int lib_api(unsigned char *data, size_t len)的API。我已經記住以下幾點:存在128位長數據

union { 
    unsigned char u8[16]; 
    uint16_t u16[8]; 
    uint32_t u32[4]; 
}; 

struct { 
    uint64_t hi; 
    uint64_t lo; 
}; 

什麼選擇會更容易使用和實施?我知道有gcc特定的128位類型,但我希望有更多的便攜式實現。

感謝。

回答

1

這兩個選項的主要問題是字節順序。

如果您知道平臺的字節順序,您可以按照您喜歡的方式實施它。請注意,您編寫的代碼因此不可移植,因此您應該採取相應的預防措施以確保它在具有正確字節順序的平臺上運行。

另一個陷阱涉及unsigned char的大小。在大多數情況下,這是8位幾乎無處不在。但它不是需要是,這是可能導致問題的東西。但是,由於此代碼可能用於特定平臺,因此您可以輕鬆檢查該代碼。

最終結果是您有兩種可能的解決方案。最便攜的解決方案,你會發現這個樣子的:

struct int128 { 
    unsigned char values[16]; 
}; 

...但最實用的解決方案往往是這樣的:

union int128 { 
    unsigned char u8[16]; 
    uint16_t u16[8]; 
    uint32_t u32[4]; 
    uint64_t u64[2]; 
    struct { 
    // anonymous struct, also assuming big-endian given your example 
    uint64_t hi; 
    uint64_t lo; 
    }; 
}; 

哪一個,你會想使用將取決於您的具體項目。

編輯:如果您有gcc特有的128位類型可用,您可以隨時將它們添加到聯合,也受#ifdef __GNUC__的保護。

+0

謝謝你的評論。在結構中放入「無符號字符值[16]」有什麼好處? – Mark

+0

@Mark Arrays通過引用傳遞,結構按值傳遞。如果類型表示一個整數,你通常需要傳遞它_by value_ - 使用一個結構體給你這種可能性(同時你仍然可以輕鬆地傳遞指針)。 – aaaaaa123456789