我知道如果我需要从一个 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
您当前正在做的是减去两个
uint32_t
。 u
代表unsigned
。当您对两个无符号整数进行操作时,您将得到一个无符号整数。在这种情况下,它是一个很大的正数。
当您将其分配给
int64_t
时,它可以拟合大的正数,因此显示正结果。然而,int
无法拟合那么大的正数,你会得到一个恰好是正确的负数。正确的方法是 -
int64_t diff = (int64_t)a - (int64_t)b;