C++ 在C和C+中编写代码时的不同值+;
我正在解决一个问题,求所有素数的和,直到200万,用C表示。 我不断地得到错误的答案(1179908154),但是当我在C++中写了同样的代码时,它给出了正确的答案(142913828922)。 请告诉我为什么会这样,谢谢 这是我的密码C++ 在C和C+中编写代码时的不同值+;,c++,c,algorithm,printf,C++,C,Algorithm,Printf,我正在解决一个问题,求所有素数的和,直到200万,用C表示。 我不断地得到错误的答案(1179908154),但是当我在C++中写了同样的代码时,它给出了正确的答案(142913828922)。 请告诉我为什么会这样,谢谢 这是我的密码 void main() { int i,j; unsigned long long sum; for(sum=2,i=3;i<=2000000;i+=2) { for(j=3;j*j<=i;j++)
void main()
{
int i,j;
unsigned long long sum;
for(sum=2,i=3;i<=2000000;i+=2)
{
for(j=3;j*j<=i;j++)
if(i%j==0)
break;
if(j*j>i)
sum+=i;
}
printf("%d",sum);
}
void main()
{
int i,j;
无符号长和;
for(sum=2,i=3;i%d
告诉printf
期望一个int
参数。sum
是一个无符号长
。这是未定义的行为。您可能需要printf(“%llu\n”,sum);
int
不适合存储高达20000000
的值;实现不需要能够使用int
表示-32767
或32767
以外的值。您可能希望i
和j
成为无符号长(适用于表示正值到<代码> 0xFFFFFFFLUL)或<代码>未签名的长long < /代码>(适用于表示正值到<代码> 0xFFFFFFFFFFFFFLUF)。如果您正在使用超出该值的值,则可能需要考虑使用任意精度的算术库,如
< C++ >代码>空白主代码()/>代码>不是C.中的有效入口点,您可能需要“代码> int”()/代码> .< /p> <更改代码类型> < <代码> >代码> j>代码> >代码>长……并使用<代码> %LD 作为格式说明符。“在其他一些实现定义的方式中”(§5.1.2.2.1/1),尽管我仍然不会在那里使用void main
。并且int
可以使用2000万,除非你的int
是16位或其他什么,这真的不再常见了。其他的至少和你说的一样大。两者都无效。有效的意思”这不可能是错误的"。请不要告诉我,你花时间让每个程序与所有可能的配置完全兼容,不管是否过时。如果你的系统是16位的,请记住这一点,继续为它制作程序。如果你正在与其他某些旧机器一起工作,请继续用三角图混淆每个人,使其与键盘兼容。它是“这真的不是你需要担心的事情,除非你在那个特定的场景中。@UnfinedBehaviour,我同意,如果你在编写代码时需要记住这一点,你最好这样做。我只是认为,当你几乎肯定以后不会遇到这些问题时,你考虑的额外数量是有限制的,这是非常重要的。”几乎所有我做的事情都是这样,所以主要是我在说。如果我被要求写可移植代码,我会在任何必要的程度上这样做。至少记住这些考虑是绝对好的,即使你不需要处理它们。我对可移植性没有任何反对意见。我自己也主张这样做,比如知道那封信不必是连续的。我认为最好知道int
可以只有16位(如果需要围绕它编写代码,您应该知道这一点),我绝对不认为void main
能在托管平台上实现任何功能。只是现在几乎所有人的int
都不会小于32位,尽管你也可以反驳ASCII假设。谁知道呢,也许我会开始使用long
而不是int代码>当我脑子里有32位值时。不回答你的问题,但是sum=2
不应该在循环初始化中。这没有合理的原因。我想从I=3开始循环,这样所有偶数都可以从素数测试中跳过,这也会排除2,这就是为什么sum=2。@Elazar:t没有问题这里初始化sum的方式。@PAUR技术上没有,但循环头是循环控制变量。sum
不以任何方式控制循环。OP使用它来保存LOC,仅此而已。@sh94初始化本身是正确的,但不合适。@Elazar:这只是编码风格和个人偏好的问题ce-这是一个常见的习惯用法,完全可以接受。与%ld
相对应的sum
仍然是未定义的行为。我在32位平台上,因此int是4字节,不超过range@sh94编译器不需要遵循平台所做的选择,一个字节不一定是8位(意味着32位可能不对应于4个字节,int
不需要占用4个字节。此外,可能存在填充位或陷阱表示,限制了int
的范围……不要将整数大小与整数范围相关联。我还想指出,“32位平台”是一个毫无意义的推销员推销;甚至在1995年,当“32位奔腾”在发布时,它有8个128位寄存器,理论上可以用来实现int
,而且为了达到这个比喻的目的,基于LP64和LLP64的64位平台使用32位int
s;这证明了平台“位大小”和int
位大小”之间的关系不能得到保证。