Art*_*tur 3 c++ types long-integer
根据MSDN(整数类型 - VC2008):
没有后缀的十进制常量的类型是int,long int或unsigned long int.可以表示常量值的这三种类型中的第一种是分配给常量的类型.
在Visual C++ 2008上运行以下代码:
void verify_type(int a){printf("int [%i/%#x]\n", a, a);}
void verify_type(unsigned int a){printf("uint [%u/%#x]\n", a, a);}
void verify_type(long a){printf("long [%li/%#lx]\n", a, a);}
void verify_type(unsigned long a){printf("ulong [%lu/%#lx]\n", a, a);}
void verify_type(long long a){printf("long long [%lli/%#llx]\n", a, a);}
void verify_type(unsigned long long a){printf("unsigned long long [%llu/%#llx]\n", a, a);}
int _tmain(int argc, _TCHAR* argv[])
{
printf("sizeof(int) %i\n", sizeof(int));
printf("sizeof(long) %i\n", sizeof(long));
printf("sizeof(long long) %i\n\n", sizeof(long long));
verify_type(-2147483647);
verify_type(-2147483648);
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
sizeof(int) 4
sizeof(long) 4
sizeof(long long) 8
int [-2147483647/0x80000001]
ulong [2147483648/0x80000000] <------ Why ulong?
Run Code Online (Sandbox Code Playgroud)
我希望const -2147483648()是int.为什么我会得到一个ulong而不是int?
我已经编程了很长时间,直到今天我还没有注意到+或 - 不是整数常量的一部分.这一个提示解释了一切.
integer-constant:
decimal-constant integer-suffix<opt>
octal-constant integer-suffix<opt>
hexadecimal-constant integer-suffix<opt>
decimal-constant:
nonzero-digit
decimal-constant digit
octal-constant:
0
octal-constant octal-digit
hexadecimal-constant:
0x hexadecimal-digit
0X hexadecimal-digit
hexadecimal-constant hexadecimal-digit
nonzero-digit: one of
1 2 3 4 5 6 7 8 9
octal-digit: one of
0 1 2 3 4 5 6 7
hexadecimal-digit: one of
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
integer-suffix:
unsigned-suffix long-suffix<opt>
long-suffix unsigned-suffix<opt>
unsigned-suffix: one of
u U
long-suffix: one of
l L
Run Code Online (Sandbox Code Playgroud)
小智 5
您正在将一元运算-符应用于整数文字2147483648.整数文字,2^31太大而不适合32位int.在现代C++中,它应该被视为一个long long,所以你的结果是令人惊讶的.
我相信旧的C标准(之前long long)允许解释一个文字太大而long不能有类型unsigned long,这与你所看到的一致.我看到你在帖子顶部引用的MSDN文档重复了这一点,所以这肯定是在这里发生了什么.
首先,-2147483648不是整数常量,因为它-是一元运算符,不是常量的一部分(至少在该上下文中).2147483648是一个整数常量,-2147483648是一个涉及该常量的表达式.
因为2147483648它不能表示为int或long int,但可以表示为unsigned long int,它获得类型unsigned long int.将一元运算-符应用于a 的结果unsigned long int本身就是一个unsigned long int.
-2147483648不是整数文字.它是-应用于整数文字的一元运算符2147483648.该文字的值不适合a signed int或者signed long,因此它具有类型unsigned long.该-运营商不改变类型.
| 归档时间: |
|
| 查看次数: |
663 次 |
| 最近记录: |