Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C和C+中编写代码时的不同值+;_C++_C_Algorithm_Printf - Fatal编程技术网

C++ 在C和C+中编写代码时的不同值+;

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++)

我正在解决一个问题,求所有素数的和,直到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++)
            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
位大小”之间的关系不能得到保证。