【发布时间】:2015-12-18 02:07:41
【问题描述】:
我有以下代码,它将结果保存为 32 位有符号整数和 64 位有符号整数。
当我用 2147483647(有符号 32 位整数的最大允许值)减去 0 时,使用 32 位有符号整数会导致问题,因此正确的方法应该是使用 64 位有符号整数,我必须将无符号 32 位类型转换为有符号 64位以获得所需的答案。这是正确的做法吗?
#include <stdio.h>
#include <string.h>
#include <stdint.h>
int main(void)
{
int32_t fig32;
int64_t fig64;
uint32_t peak_seq = 2480694779;
uint32_t pkt_seq = 2480694780;
uint32_t zero_seq = 0;
fig32 = peak_seq - pkt_seq;
fig64 = peak_seq - pkt_seq;
printf("\n 32 ans : %d, 64 ans is %ld\n", fig32, fig64);
fig32 = zero_seq - pkt_seq;
fig64 = zero_seq - pkt_seq;
printf("\n 32 ans : %d, 64 ans is %ld\n", fig32, fig64);
fig64 = (int64_t)peak_seq - (int64_t)pkt_seq;
printf("\n fix for (peak - pkt) 64 ans is %ld\n", fig64);
fig64 = (int64_t)zero_seq - (int64_t)pkt_seq;
printf("\n fix for (zero - pkt) 64 ans is %ld\n", fig64);
}
当我运行这个程序时,我得到以下输出
32 ans : -1, 64 ans is 4294967295
32 ans : 1814272516, 64 ans is 1814272516
fix for (peak - pkt) 64 ans is -1
fix for (zero - pkt) 64 ans is -2480694780
- 在第一行中,为什么 64 位的答案是 4294967295 而不是 -1?
- 是否将所有无符号 32 位整数类型转换为有符号 64 位 解决这个问题的唯一方法?
【问题讨论】:
-
1:因为
int64_t可以代表uint32_t的所有值。 -
另外,您应该使用
"%"PRIu32and"%"PRId64from<inttypes.h>分别使用printf打印uint32_t和int64_t值。 -
long不一定是 64 位类型。如果两个操作数都是 32 位类型,则操作总是以 32 位类型完成。因此peak_seq - pkt_seq类似于(int64_t)(peak_seq - pkt_seq)。如果您想以更高的精度进行操作,请在执行操作之前进行转换
标签: c