printf("%lld %d")和printf("%d %lld")打印结果不一样

ohayao_9270 2015-07-19 10:18:20

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??
...全文
675 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ohayao_9270 2015-07-19
  • 打赏
  • 举报
回复
我终于好像搞明白第一个问题了

 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个字节???
LubinLew 2015-07-19
  • 打赏
  • 举报
回复

//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;
}
ohayao_9270 2015-07-19
  • 打赏
  • 举报
回复
第二个问题,百度到这的回答: scanf()语句:"%lf"用于double类型,"%f"用于float类型 printf()语句:"%f"用于double类型 double和long double 都是8个字节没影响的输出 后来在pdf中找到这样一句: 浮点型参数的转换 有用于打印double和long double的转换说明符, 但没有用于float的说明符,原因是在K&R C中float的值在被用于表达式中或参数之前,会被自动转换为double类型.

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧