69,336
社区成员
发帖
与我相关
我的任务
分享
printf("%lld, %d\n", LLONG_MAX, LLONG_MAX);
printf("%d, %lld\n", LLONG_MAX, LLONG_MAX);
输出结果:
9223372036854775807, -1
-1, -2147483649 //这里的-2147483649是用多少位二进制表示的??
LLONG_MAX 是一个0+63个1,怎么整也不会整出-2147483649
printf("%f\n", FLT_MAX);
printf("%f\n", LDBL_MAX);
输出结果:
3.4028234660000000000000.000000 //38位
1.79769313486231580000000000....000.000000 // 300多位 // %f怎么能表示e308??
printf("%d, %lld\n", LLONG_MAX, LLONG_MAX); //-1, -2147483649
LLONG_MAX =
a: 1111 1111 ........ 1111 1111 (低位4个字节)32个1
b: 0111 1111...........1111 1111 (高位4个字节)0和31个1
c: 1111 1111 ........ 1111 1111
d: 0111 1111...........1111 1111
( LLONG_MAX, LLONG_MAX) 的值分别对应(ba, dc)
printf("%d, %lld")的意思是先取4个字节给%d, 再取8个字节给%lld, 也就是a给了%d, cb给了%lld,
而a就是-1补码,cb就是-2147483649的补码=-1-(2147483648=2^-31)
至于第二个问题,难道%f也是对应8个字节???
//windows
#include <limits.h>
#include <float.h>
#include <stdio.h>
/*
#define LLONG_MAX 9223372036854775807i64 maximum signed long long int value
#define FLT_MAX 3.402823466e+38F max value
#define LDBL_MAX 1.7976931348623158e+308 max value
*/
int main(void)
{
printf("%lld, %d\n", LLONG_MAX, LLONG_MAX);
printf("%d, %lld\n", LLONG_MAX, LLONG_MAX);
//只要%d打印LLONG_MAX,后续值的打印都会出错,这应该与printf的实现有关
printf("%lld, %d, %d\n", LLONG_MAX, LLONG_MAX, 1); //9223372036854775807, -1, 2147483647
printf("%d, %lld, %d\n", LLONG_MAX, LLONG_MAX, 1); //-1, -2147483649, 2147483647
printf("\n\n");
//估计还是跟prinf有关,坐等大神 或者 字节研究一下 printf的实现
printf("%f\n", FLT_MAX); //340282346638528860000000000000000000000.000000
printf("%f\n", LDBL_MAX); /*
17976931348623157000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000.000000 */
return 0;
}