如果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表示的值非常不同。