滑稽足夠了,但你實際上並不需要任何後綴添加到您的十六進制常量,以便它被正確處理。 C標準和C++標準的第2.14.3第6.4.4.1包含下表:
Suffix | Decimal Constant | Octal or Hexadecimal Constant
-------------+------------------------+------------------------------
none | int | int
| long int | unsigned int
| long long int | long int
| | unsigned long int
| | long long int
| | unsigned long long int
-------------+------------------------+------------------------------
u or U | unsigned int | unsigned int
| unsigned long int | unsigned long int
| unsigned long long int | unsigned long long int
-------------+------------------------+------------------------------
l or L | long int | long int
| long long int | unsigned long int
| | long long int
| | unsigned long long int
-------------+------------------------+------------------------------
Both u or U | unsigned long int | unsigned long int
and l or L | unsigned long long int | unsigned long long int
-------------+------------------------+------------------------------
ll or LL | long long int | long long int
| | unsigned long long int
-------------+------------------------+------------------------------
Both u or U | unsigned long long int | unsigned long long int
and ll or LL | |
此表告訴我們一個整型常量會產生什麼樣的類型。整數常量的類型將是它適合的第一個類型。
這意味着編譯器將遍歷以下類型的十六進制常量0x800000000000000
(它沒有後綴,所以它使用「none」行,它是一個十六進制常量,因此它使用「十六進制常量」列),它會使用能夠存儲值*第一種類型:
int
:沒有,一個32位帶符號整數不能存儲此值。
unsigned int
:不,一個32位無符號整數不能存儲這個值。
long int
:不,32位有符號整數不能存儲此值。
unsigned long int
:不,32位無符號整數不能存儲此值。
long long int
:否,64位有符號整數不能存儲此值。
unsigned long long int
:是,一個64位無符號整數可以存儲此值。由於這是第一種可以完全存儲該值的類型,因此這是整型常量將具有的類型。
因此,要回答你的問題「我如何編寫和使用的價值0x800000000000000
並確保編譯器將不能治療高位爲符號位?」:簡單地只寫unsigned long long value = 0x800000000000000
。
如果您想對值進行一些按位運算,您可以繼續前進並執行該操作(即只寫0x800000000000000 >> myval
)。您可以保證它不會被視爲溢出的有符號整數,並且您的右移不會執行任何符號擴展,因爲它是正值。
*我假設int
是32位,long
是32位,並且是long long
64比特。請注意,您的編譯器可能會爲這些類型使用不同的位大小,這可能會改變最終結果(儘管過程仍然相同)。
在我的Visual Studio中,limits.h具有語法0xffffffffffffffffui64,因此0x800000000000000ui64應該可以工作。但是,這是一個較新的版本,所以也許它在Visual Studio 2008中不起作用。 – anatolyg 2015-07-21 10:19:03
對於十六進制整數,@MM:U可以是unsigned int,unsigned long int或unsigned long long int不變。 UL可以是'unsigned long int'或'unsigned long long int'。參見C標準的6.4.4.1(或C++標準的2.14.3)。鑑於此,我不認爲OP的例子不正確或需要修改。 – Cornstalks 2016-03-23 00:01:59
這是一個較老的問題。在C++ 11中,我認爲不需要任何後綴。只有一個無符號的64位整型可以保存該常量。無符號long long必須至少爲64位,並且這是編譯器應該嘗試以十六進制格式的文本類型的列表。 http://en.cppreference.com/w/cpp/language/integer_literal – 2016-03-23 17:24:08