C/C中的long++; 我在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; } #包括; int main() { int num1=100000000; 长num2=100000000; 长num3; //num3=10000000000; 长num4=~0; printf(“%u%u%u”、sizeof(num1)、sizeof(num2)、sizeof(num3)); printf(“%d%ld%lld%llu”、num1、num2、num3、num4); 返回0; }

C/C中的long++; 我在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; } #包括; int main() { int num1=100000000; 长num2=100000000; 长num3; //num3=10000000000; 长num4=~0; printf(“%u%u%u”、sizeof(num1)、sizeof(num2)、sizeof(num3)); printf(“%d%ld%lld%llu”、num1、num2、num3、num4); 返回0; },c++,types,long-integer,C++,Types,Long Integer,当我取消注释注释注释行时,代码不会编译,并给出一个错误: 错误:整型常量对于长类型太大 但是,如果代码按原样编译并执行,它将生成远大于1000000000的值 为什么?字母10000000000构成一个文字整型常量,但该值对于类型int而言太大。您需要使用后缀来更改文本的类型,即 long long num3 = 100000000000LL; 后缀LL将文本转换为类型long。C不够“聪明”,无法从左边的类型得出结论,类型是文本本身的属性,而不是使用它的上下文。试试: num3 = 1000

当我取消注释注释注释行时,代码不会编译,并给出一个错误:

错误:整型常量对于长类型太大

但是,如果代码按原样编译并执行,它将生成远大于1000000000的值


为什么?

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

long long num3 = 100000000000LL;
后缀
LL
将文本转换为类型
long
。C不够“聪明”,无法从左边的类型得出结论,类型是文本本身的属性,而不是使用它的上下文。

试试:

num3 = 100000000000LL;

<>和BTW,在C++中,这是一个编译器扩展,标准没有定义长的长度,这是C99的一部分。

< P>你的代码在这里编译得很好(即使没有注释的那行,也必须把它改成

)。
num3 = 100000000000000000000;

开始警告。

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


下一个C++版本将正式支持长的方式,除非你明确地希望文本的类型至少长时间长,否则你将不需要任何后缀。如果不能长时间地表示数字,编译器将自动使用长LIN,即使没有LL后缀。在C++中,整数文本是它所适合的int或长度较小的一个。在C99中,它是最小的int,长,长。因此,当将长长的长度锚定到C++作为非标准扩展时,也许编译器也采用了C99规则。在64位linux系统上。@SteveJessop可能晚了一点:但长不一定是64位。大多数时候是这样,但你不能保证它会无处不在。你唯一能保证的是它至少和int一样大,而int又至少和短int一样大,而短int又至少和char一样大。最后,char是d定义为足以表示实现的基本字符集中的每个字符(通常为8位)。@Paulus86:我不是说保证。Omry说他在64位Debian系统上使用gcc 4.3.2。我注意到这解释了他从那时起看到的情况(我碰巧知道这是常识)gcc在这种系统上默认配置为使用64位

long
,与该操作系统的LP64 ABI一致。@SteveJessop我并不是说你的评论是错误的!只是指出long总是64位的假设是危险的,不幸的是,很多人都认为这一假设很危险。在写这个答案时,它是probaBLUE正确,但是现在C++标准席上说,没有后缀的整数文字是第一个<代码> int <代码>,<代码> long int < />代码>和<代码> long long int /COD>,其中可以表示它的值。[C++PAR.2.142/2 ]因此,现在不需要在一个整数字上添加“LL”后缀,这对于其他类型来说太大了。这是一个问题,因为C++没有足够智能来从被分配的变量的类型来确定文字类型,这只是因为编译器扩展没有实现EXTEN。C++的整数类型,它可以很好地与标准语言一起工作。C++现在有规则,使得任何扩展的整数类型都会更好地与标准相结合:“放松”,我认为答案应该根据这些建议来编辑。现在可能已经太迟了,但对于未来读者,我建议您使用<代码> <代码>,使用<代码> UTIN 64×T < /代码。>。若要显示64位值,
printf(“%”PRIu64“\n”,val);
@faironicGeek
包含,
uint64\u t a=0xffffffffffffff;printf(“%”PRIu64“\n”,a);:错误:应为“”,在“PRIu64”printf(“%”PRIu64“\n”,a)”之前:::警告:格式[-Wformat=]printf(“%”PRIu64”\n“,a)中的尾随“%”
#定义STDC格式宏1
请参见,C++11现在定义了long-long