数字打印为负值,但不知何故测试为正值

car*_*lal 0 c printf

这可能是我遇到的最奇怪的事情:一个同时是正面和负面的数字!(我可以向你证明这一点,因为我的输入/输入链接到我的代码在ideaone.基本上,我的输出是一个负数,但更奇怪的是:当我检查它是否小于零时,它是假的(?!).更奇怪的是:当你将它乘以一个以外的数字时,它会切换回打印为正数.

当我在Xcode上编译时,这个错误不会发生,但是在互联网(或其他一些编译器)上编译时会发生这种错误,例如我链接中的编译器.

理解它究竟是什么并不重要,我想知道为什么这个值同时是负面和正面的.

#include <stdio.h>
#include <cmath>

int main()
{
    unsigned long answer,T,n,N,a,d,b,L1,amount;

    scanf("%ld",&T); // number of test cases to loop through
    while (T--) {
        scanf("%ld",&N); 

        amount = 0;
        answer = 0;
        n=N-N%2;
        for (a = 1; a <= n/2; a++) {
            d = N-a;
            L1 = a*d;          

            for (b = 1; b*b < L1 ; b++) {
                // "amount" is always a positive number
                amount = 2*(((L1-1)/b) - b + 1) - 1;

                if (d==a) answer+=amount;
                else answer+=2*amount;  // we are only adding positive values to this
            }
        }

        if (answer<0) printf("This answer is less than zero %ld\n",answer);
        if (answer>0) printf("This answer is greater than zero %ld\n",answer);
        printf("%ld\n",answer);
        printf("%ld\n",2*answer/2);
    }
}
Run Code Online (Sandbox Code Playgroud)

输入:

1 2500

输出:

Success  time: 0.02 memory: 3300 signal:0
This answer is greater than zero -1842629629
-1842629629
304854019
Run Code Online (Sandbox Code Playgroud)

如你所见,我的否定答案大于零.更不用说,它与我在Xcode中编译时的答案不同,即使是正面形式.

我很惊讶.它打印出一个"正面"的负数

证据来自ideaone.com

Joh*_*hnH 5

answer是无符号的. %ld在格式字符串中签名很长.更改%ld%lu,您不会在打印时将未签名的值更改为签名值,并且它将正确打印.

    if (answer<0) printf("This answer is less than zero %lu\n",answer);
    if (answer>0) printf("This answer is greater than zero %lu\n",answer);
Run Code Online (Sandbox Code Playgroud)

  • @ user3400450 - 包含<stdint.h>并使用uint32_t或uint64_t. (2认同)