在 C 中,为什么 Double 类型不能像它应该的那样给你 2^64?



如果sizeof((给出一个'double'类型的8个字节。然后,双精度类型应该能够存储2^64位数字并输出这么多数字,即2^63=9.2233720368548E+18。

但我有点奇怪。

1  #include <stdio.h>
2  #include <stdbool.h>
3  #include <math.h>
4  
5  int main(){
6  double a;
7  
8  a = pow(2, 63);
9  
10  printf("Size of Double is = %d bytesn", sizeof(a));
11  printf("Print full number of 2^63 = %dn", a);
12  
13  return 0;
14  }

相反,输出是

Size of Double is = 8 bytes
Print full number of 2^63 = -283958688

如果你想知道我在64位Ubuntu上运行。

64位最多可以表示2^64不同的值,但(1(C不承诺使用所有64位,(2(在浮点类型中,并非所有不同的值都表示整数。

浮点数字必须使用它们的一些位来表示符号和指数。对于目前的大多数平台,64位double的符号为1位,指数为11位,有效位为52+1位。(+1是1的最高有效位。它实际上并不存在;它是由指数的值暗示的,并且仅对于其值表示零和非标准化的指数,它被假定为零。(

设计的最终结果是,-2^53和2^53之间的任何整数都适合。。。如果你能接受一些巨大的警告,那么这些整数中的任何一个乘以足够小的二次方都会如此。(问题是,超过2^53的整数会忘记除其最高有效53位之外的所有位,因此,例如,您不能将它们加1来获得下一个整数。(

至于printf,由于格式字符串表示的类型与实际传递的类型不同,因此会遇到未定义的行为。但一个可能的结果是,你会看到一个代表double的int值的十进制版本,它通常与double表示的值非常不同。

相关内容

最新更新