printf 缓冲机制的问题

来源:互联网 发布:php找出数组最大值 编辑:程序博客网 时间:2024/05/02 15:11

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底层应该有自动输出检测格式的,然后应该不存在这个问题!


0 0