如何在VS2008中指定64位无符号int const 0x8000000000000000?

时间:2010-05-14 16:17:33

标签: c++ c visual-studio

我读到了关于整数常量的Microsoft特定后缀“i64”。我想做一个不合时宜的转移到ULONGLONG ULONGLONG bigNum64 = 0x800000000000000i64 >> myval;

在正常的C中,我会使用后缀“U”,例如类似的32位操作将是
ULONG bigNum32 = 0x80000000U >> myval;

我不希望2的补码符号扩展通过高位传播。我想在64位常数上进行UNSIGNED转换。我认为我的第一个声明是要做一个SIGNED右移。

我尝试了0x800000000000000i64U0x800000000000000u64,但遇到了编译错误。

2 个答案:

答案 0 :(得分:31)

您可以使用后缀ull,这是标准(C99和C ++ 0x)方式来指定unsigned long long整数文字,而long long至少为64位

答案 1 :(得分:10)

很有趣,但实际上你不需要为你的十六进制常量添加任何后缀,以便正确处理它。 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位无符号整数可以存储此值。由于这是第一种可以完全存储值的类型,因此这是整数常量所具有的类型。
  7. 那么,回答你的问题“如何编写和使用值0x800000000000000并确保编译器不会将高位视为符号位?”:只需编写{{1} }。

    如果你想对该值进行一些按位运算,你可以继续这样做(即只写unsigned long long value = 0x800000000000000)。您保证不会将其视为溢出的有符号整数,并且您的右移不会执行任何符号扩展,因为它是正值。

    *我假设0x800000000000000 >> myval是32位,int是32位,long是64位。请注意,您的编译器可能会对这些类型使用不同的位大小,这可能会更改最终结果(尽管过程仍然相同)。