簡體   English   中英

如何在VS2008中指定64位無符號int const 0x8000000000000000?

[英]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右移。

我嘗試了0x800000000000000i64U0x800000000000000u64但是遇到了編譯器錯誤。

您可以使用后綴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”行,並且它是十六進制常量,因此它使用“十六進制常量”列),並且它將使用可以存儲該值的第一種類型*:

  1. int :不,32位有符號整數不能存儲該值。
  2. unsigned int :不,32位無符號整數不能存儲該值。
  3. long int :不,32位有符號整數不能存儲該值。
  4. unsigned long int :不,32位無符號整數不能存儲該值。
  5. long long int :不,64位有符號整數不能存儲該值。
  6. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM