您的位置:首页 > 其它

printf 缓冲机制的问题

2014-04-09 16:33 211 查看
printf()打印的时候,猜测应该会先把输出的参数写到stdout文件里面,然后按照%d或者%lld等格式去文件里面取出来,

然后这样的就造成一个问题,就是前面的输出的参数按照不同的格式输出,输出的结果就会影响到后面的参数的输出;

例如:

int32_t a = 1234; int64_t b = 8976;

printf( "b = %lld, a = %d \n", b, a );

输出的结果是预期的结果: b = 8976, a = 1234;

int32_t a = 1234; int64_t b = 8976;

printf( "b = %d, a = %d \n", b, a );

这样呢,输出的结果则会和预期的
有天差之别: b = 8976, a = 0;

原因:int64_t 占用8个字节,int32_t占用四个字节, 当调用printf的时候,会吧b按照8个字节写到stdout, 把a按照4个字节写到stdout,

然后再通过前面的格式参数去文件里面取值:%d取四个字节,所以,在以上的情况的时候,会把8976取出来, 然后剩余的四个字节是0, 然后就是输出的结果;

int32_t a = 1234; int64_t b = 0x5678905678909090;

printf( "b = %x, a = %x \n", b, a );

%x输出也是按照四个字节取出的。。,

或者你可以直接

int32_t a = 1234; int64_t b = 0x5678905678909090;

printf( "b = %d, a = %d \n", b, a );

这样把输出的int数据再转换成十六进制的,效果是一样的,注意大小端的问题;

这些问题通过强制转换就可以避免这个问题;;;;;;;

对 java 不了解,java底层应该有自动输出检测格式的,然后应该不存在这个问题!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: