滑稽足够了,但你实际上并不需要任何后缀添加到您的十六进制常量,以便它被正确处理。 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