要求無符號整數能夠存儲介於0-65536之間的值。 int64_t(便攜式版本,從<stdint.h>
)將能夠存儲 - (2 -1)和2 之間的值。這裏存在一個問題,那就是無符號整型可能是64位長,並且可能代表int64_t範圍之外的值(參見C標準的第5.2.4.2.1節p1以及下面的部分)。
下面是標準的說:
6.3.1.3符號和無符號整數
- 當與整型值轉化爲除_Bool以外的其他整數類型,如果該值可以是由新型代表,它沒有改變。否則,如果新類型是無符號的,則通過反覆地增加或減去一個多於新類型中可表示的最大值的值來轉換該值,直到該值處於新類型的範圍內。 60)
- 否則,新類型被簽名並且其值不能被表示;結果是實現定義的或實現定義的信號被引發。
60)規則描述數學值的算術,而不是給定類型的表達式的值。
忽略與計算異常相對應的實現定義信號是未定義的行爲。
對於無符號到符號轉換的情況,我建議明確定義您的行爲。飽和度最簡單:當您的unsigned int值大於INT64_MAX時,轉換結果將爲INT64_MAX。這看起來像x > INT64_MAX : INT64_MAX ? x
。包裝LIA樣式(例如,unsigned int x = UINT_MAX; ++x == 0
)對於int64_t是可能的,因爲保證int64_t不包含填充,但需要做更多的工作來保證可移植性。我建議像(x & INT64_MIN) > INT64_MAX ? -(x & INT64_MAX) : x & INT64_MAX
這樣的東西,如果你可以找到一些斷言你的int64將具有與C標準int64_t相同的表示。
只需使用像你一樣的演員就可以了。你必須有一個64位無符號整型的適當的typedef,例如'stdint.h' –
Euh,'uint64 n =(uint64)k;',也許? – 2013-01-20 20:23:04
@PreetSangha爲什麼呢?將東西轉換爲int64是OP正在尋找的東西,而不是? – 2013-01-20 20:34:45