繁体   English   中英

VC ++中的文字类型

[英]Literals types in VC++

我知道标准如下:

  • 以0开头的积分被解释为八进制。
  • 以0x或0X开头的积分被解释为十六进制。

整数文字的类型取决于其值和符号:

  • 默认情况下,小数是有符号的,并且具有值适合的最小类型int,long,long long。
  • 十六进制和八进制可以是有符号或无符号的,并且具有最小类型的int,unsigned int,long,unsigned long,long long,unsigned long long,其中文字值适合。
  • 没有类型为short的文字但这可以通过后缀覆盖。

但是VC ++怎么样?! 它似乎将十进制,八进制和十六进制视为相同,并且小数也允许使用无符号类型。

类似下面的代码:

cout << typeid(4294967295).name() << endl;
cout << typeid(4294967296).name() << endl;

cout << typeid(0xffffffff).name() << endl;
cout << typeid(0x100000000).name() << endl;

得到:

unsigned long
__int64
unsigned int
__int64

这是预期的,为什么它与标准不同?

看来,就你的第一个结果而言,VC ++仍然遵循C89 / 90的规则,其中说(第6.1.3.2节):

整数常量的类型是相应列表中可以表示其值的第一个。 unsuffixed decimal: intlong intunsigned long int ; [...]

因此,由于4294967295可以表示为unsigned long int ,因此它正在使用它。

在C ++ 98/03中,仍然允许这样做,但不再需要 - 您使用的值大于可以在long int表示的值,这会给出未定义的行为(第2.13.1 / 2节):

如果它是十进制且没有后缀,则它具有这些类型中的第一个,其值可以表示为: intlong int ; 如果该值不能表示为long int,则行为未定义。

[强调补充]

C ++ 11将long long int添加到列表中,因此4294967295 应该成为类型,但即使在VC ++ 2013 RC中,它仍然遵循C89 / 90标准,并给它类型unsigned long int

请注意, typeid生成的字符串是实现定义的,因此它不必直接对应于该类型的正确名称。 如果使用重载,我们可以看到0x1000000004294967296类型为long long

#include <iostream>

void f(unsigned long){
    std::cout << "unsigned long\n";
}

void f(long long) {
    std::cout << "long long\n";
}

void f(unsigned long long) {
    std::cout << "unsigned long long\n";
}

void f(unsigned) {
    std::cout << "unsigned int\n";
}

int main(){
    f(4294967295);
    f(4294967296);
    f(0xffffffff);
    f(0x100000000);
}

VC ++ 2008和VC ++ 2013 RC的结果:

unsigned long
long long
unsigned int
long long

我没有安装所有介入版本,但考虑到2008年和2013年的匹配,我认为可以猜测它们之间的版本也是同样的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM