为了账号安全,请及时绑定邮箱和手机立即绑定

在C / C ++中很久很久

在C / C ++中很久很久

C++ C
慕神8447489 2019-11-28 10:39:20
我正在GNU的C ++编译器上尝试此代码,但无法理解其行为:#include <stdio.h>;int main(){    int  num1 = 1000000000;    long num2 = 1000000000;    long long num3;    //num3 = 100000000000;    long long num4 = ~0;    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));    printf("%d %ld %lld %llu", num1, num2, num3, num4);    return 0;}当我取消注释注释行时,代码将无法编译并给出错误:错误:整数常量对于长型而言太大但是,如果代码按原样编译并执行,它将产生比10000000000大得多的值。为什么?
查看完整描述

3 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

字母100000000000组成一个文字整数常量,但该值对于type而言太大int。您需要使用后缀来更改文字的类型,即


long long num3 = 100000000000LL;

后缀LL使文字变为type long long。C不够“聪明”,无法从左侧的类型得出结论,该类型是文字本身的属性,而不是使用它的上下文。


查看完整回答
反对 回复 2019-11-28
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

这取决于您以哪种模式进行编译。long long不是C ++标准的一部分,而是(通常)仅作为扩展支持。这会影响文字的类型。如果int足够大以表示数字,则不带任何后缀的十进制整数常量始终为int类型,否则为long。如果该数字太长了,结果将是实现定义的(可能只是为了向后兼容而被截断的long int类型的数字)。在这种情况下,您必须显式使用LL后缀来启用long long扩展(在大多数编译器上)。

下一个C ++版本将正式支持long格式,除非您明确希望将文字类型的类型强制设置为long格式,否则您将不需要任何后缀。如果数字不能用长整数表示,则即使没有LL后缀,编译器也会自动尝试使用long long。我相信这也是C99的行为。


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 575 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信