【发布时间】:2021-10-02 20:03:10
【问题描述】:
以下代码通过将long long int 类型的变量分配给int64_t 类型的变量,将long long int 类型的值转换为int64_t 类型的值。这种将long long int 转换为int64_t 的方式存在哪些潜在问题?
#include <stdio.h>
#include <stdint.h>
int main (void) {
long long int num = 9223372036854775807; // 2^63-1
int64_t num64_t = num;
printf("%lld\n", num64_t);
return 0;
}
一个问题可能是 ISO/IEC 9899:1999 standard 在 p 上指定。 22, § 5.2.4.2.1,long long int 的范围至少 ±2^63-1,而int64_t 类型有正好 64 位宽度。是不是在某些机器上long long int 类型的值使用超过 64 位存储?如果num 的值大于2^63-1 或小于-(2^63-1),这可能会导致上述程序崩溃,因为num64_t 只有64 位可用。
如果这是一个问题:还有其他问题吗?更一般地说:上述方法是将long long int 类型的值转换为int64_t 类型的值的安全方法吗?如果没有,如何避免这些问题?
【问题讨论】:
-
您可以在赋值前将值与
INT64_MIN和INT64_MAX进行比较,以确保赋值正确。