【发布时间】:2012-08-08 10:32:41
【问题描述】:
我已经实现了以下代码:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<cstdlib>
#include<sys/types.h>
main()
{
int64_t i64value1 = 0;
int64_t i64value2 = 0;
long long llvalue = 0;
const char *s = "10811535359";
i64value1 = atoll(s);
llvalue = atoll(s);
i64value2 = llvalue;
printf("s : [%s]\n",s);
printf("i64value1 : [%d]\n",i64value1);
printf("llvalue : [%lld]\n",llvalue);
printf("i64value2 : [%d]\n",i64value2);
}
上述程序的输出是:
s : [10811535359]
i64value1 : [-2073366529]
llvalue : [10811535359]
i64value2 : [-2073366529]
使用的编译器是:
gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)
操作系统是 x86_64 GNU/Linux 2.6.18-194
因为 long long 是一个有符号的 64 位整数,并且在所有意图和目的上都与 int64_t 类型相同,逻辑上是 int64_t和 long long 应该是等价的类型。并且有些地方提到使用 int64_t 而不是 long long。 但是当我查看 stdint.h 时,它告诉我为什么会看到上述行为:
# if __WORDSIZE == 64
typedef long int int64_t;
# else
__extension__
typedef long long int int64_t;
# endif
在 64 位编译中,int64_t 是 long int,而不是 long long int。
我的问题是,是否有一种解决方法/解决方案可以将 long long 返回值分配给 int64_t 而不会丢失 64 位机器中的精度?
提前致谢
【问题讨论】:
-
long和long long在 x86_64 上是相同的。int64_t是一个正好有 64 位的类型,而long long至少 与long一样大,long至少 与 @ 一样大987654331@(顺便说一下,在这种情况下也是 64 位)。就目前而言,不用担心。 -
如果 x86_64 你的意思是 Linux x86-64,这是真的。对于同一硬件上的 64 位 Windows(
long是 32 位),这绝对不是真的。