![](/img/trans.png)
[英]format '%lld' expects type 'long long int', but argument 4 has type 'int64_t'
[英]Convert Long Long Int to int64_t in C by Assignment
下面的代码转换类型的值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 标准在p.1 中指定。 22, § 5.2.4.2.1, long long int
的范围至少是±2^63-1,而int64_t
类型正好有64 位宽度。 可能是在某些机器上使用超过 64 位存储long long int
类型的值吗? 如果num
的值大于 2^63-1 或小于 -(2^63-1),这可能会导致上述程序崩溃,因为num64_t
只有 64 位可用。 如果这是一个问题:还有其他问题吗? 更一般地说:上述方法是将long long int
类型的值转换为int64_t
类型的值的安全方法吗? 如果没有,如何避免这些问题?
一个问题可能是 ISO/IEC 9899:1999 标准在 p.1 中指定。 22, § 5.2.4.2.1,
long long int
的范围至少是±2^63-1,而 int64_t 类型正好有64 位宽度。
C99 已过时,但该标准的更新版本(当前为 C2017)指定了相同的内容。 是的,这是一个潜在的问题:与其说是类型的大小,不如说是它们的可表示值的范围。 如果您尝试将long long int
值分配给int64_t
,并且该值不能表示为int64_t
,那么结果要么是实现定义的,要么引发实现定义的信号。
可能是在某些机器上使用超过 64 位存储 long long int 类型的值吗?
是的,这是可能的。 而且long long int
的范围比int64_t
的范围更宽。
如果
num
的值大于 2^63-1 或小于 -(2^63-1),这可能会导致上述程序崩溃,因为num64_t
只有 64 位可用。
是的,如果结果是发出一个信号,那么这可能会导致程序崩溃。 然而,更典型的情况是,转换成功但(必然)在受让人中产生了不同的价值。 这可以说是更糟,因为您没有立即注意到问题。
如果这是一个问题:还有其他问题吗? 更一般地说:上述方法是将
long long int
类型的值转换为int64_t
类型的值的安全方法吗?
将整数值分配给任何整数类型的对象会自动将该值转换为目标类型。 当分配的值可在目标类型中表示时,允许从一种整数类型转换为另一种类型并保留值。 尽管与您的具体情况无关,但如果目标类型是无符号的,则允许并明确定义此类转换,即使原始值在无符号目标类型中无法表示。 我已经描述了所有其他情况下的效果。
也就是说,不,除了已经描述的尝试将超出范围的值分配给目标有符号整数对象的后果之外,没有需要担心的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.