![](/img/trans.png)
[英]Best code for compiling static const int = X in VS2008 and GCC
[英]How do you specify a 64 bit unsigned int const 0x8000000000000000 in VS2008?
我讀了關於整數常量的Microsoft特定后綴“i64”。 我想做一個UNSLigned轉到ULONGLONG。
ULONGLONG bigNum64 = 0x800000000000000i64 >> myval;
在正常的C中,我會使用后綴“U”,例如類似的32位操作
ULONG bigNum32 = 0x80000000U >> myval;
我不希望2的補碼符號擴展通過高位傳播。 我想在64位常數上進行UNSIGNED轉換。 我認為我的第一個聲明是要做一個SIGNED右移。
我嘗試了0x800000000000000i64U
和0x800000000000000u64
但是遇到了編譯器錯誤。
您可以使用后綴ull
,這是標准(C99和C ++ 0x)方式來指定unsigned long long
整數字,而long long
至少為64位。
很有趣,但實際上你不需要為你的十六進制常量添加任何后綴,以便正確處理它。 C標准的6.4.4.1節和C ++標准的2.14.3節包含下表:
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位。 請注意,您的編譯器可能會對這些類型使用不同的位大小,這可能會更改最終結果(盡管過程仍然相同)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.