![](/img/trans.png)
[英]What should `intmax_t` be on platform with 64-bit `long int` and `long long int`?
[英]Is it possible to assign long long returne value to int64_t without losing the precision in a 64-bit Machine?
我已经实现了以下代码:
#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 位机器中的精度?
提前致谢
损失不会发生在转换中,而是发生在打印中:
printf("i64value1 : [%d]\n",i64value1);
访问int64_t
参数就好像它是一个int
。 这是未定义的行为,但通常低 32 位是符号扩展的。
正确的编译器警告(例如 gcc -Wformat
)应该对此抱怨。
吉尔斯是对的。
要么使用std::cout <<
我认为应该以正确的方式处理它,或者使用printf("i64value2 : [%lld]\\n",i64value2);
而打印应该解决它。
在x86-64 ABI 下- long long
与long
相同,即 64 位值。 在这种情况下没有精度损失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.