fra*_*ji1 23 c c++ visual-studio
我读了关于整数常量的Microsoft特定后缀"i64".我想做一个UNSLigned转到ULONGLONG.
ULONGLONG bigNum64 = 0x800000000000000i64 >> myval;
在正常的C中,我会使用后缀"U",例如类似的32位操作
ULONG bigNum32 = 0x80000000U >> myval;
我不希望2的补码符号扩展通过高位传播.我想在64位常数上进行UNSIGNED转换.我认为我的第一个声明是要做一个SIGNED右移.
我试过0x800000000000000i64U
,0x800000000000000u64
但有编译器错误.
Cor*_*lks 12
很有趣,但实际上你不需要为你的十六进制常量添加任何后缀,以便正确处理它.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 | |
Run Code Online (Sandbox Code Playgroud)
该表告诉我们整数常量的类型.整数常量的类型将是值适合的第一种类型.
这意味着编译器将迭代十六进制常量的以下类型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位.请注意,您的编译器可能会对这些类型使用不同的位大小,这可能会更改最终结果(尽管过程仍然相同).
归档时间: |
|
查看次数: |
26475 次 |
最近记录: |