int64_t 无法容纳实际的减法结果

问题描述 投票:0回答:1

我知道如果我需要从一个 32 位数字中减去另一个数字,那么我应该使用 64 位类型。
例如

uint32_t a = 1, b = 3123456789;
int diff = a - b;

是错误的,因为

diff
无法容纳结果。

但我无法理解我的代码片段是如何工作的。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{
        uint32_t a = 123;
        uint32_t b = 260000;
        int64_t diff = a - b;
        int diff2 = a - b;

        printf("DIFF:%ld\n", diff);
        printf("DIFF:%" PRId64 "\n", diff);

        printf("DIFF2:%d\n", diff2);

        if(diff < 0)
                puts("OK");

        if(diff2 < 0)
                puts("OK2");

        return 0;
}

为什么正确答案在 diff2 中而不是在 diff 中? .. 大有符号整数如何不能包含两个较小无符号整数的实际减法结果?

输出:

DIFF:4294707419
DIFF:4294707419
DIFF2:-259877
OK2
c++ c types integer
1个回答
0
投票

您当前正在做的是减去两个

uint32_t
u
代表
unsigned
。当您对两个无符号整数进行操作时,您将得到一个无符号整数。在这种情况下,它是一个很大的正数。

当您将其分配给

int64_t
时,它可以拟合大的正数,因此显示正结果。然而,
int
无法拟合那么大的正数,你会得到一个恰好是正确的负数。正确的方法是 -

int64_t diff = (int64_t)a - (int64_t)b;

© www.soinside.com 2019 - 2024. All rights reserved.