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底层应该有自动输出检测格式的,然后应该不存在这个问题!
然后这样的就造成一个问题,就是前面的输出的参数按照不同的格式输出,输出的结果就会影响到后面的参数的输出;
例如:
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底层应该有自动输出检测格式的,然后应该不存在这个问题!
相关文章推荐
- linux下C语言printf没有输出的问题(shell的行缓冲机制)
- Printf的缓冲机制
- cout和printf的缓冲机制
- cout于printf的缓冲机制
- 操作系统 带有缓冲机制的生产者消费者问题
- C语言中printf()缓冲问题详解
- [转]cout和printf的缓冲机制
- t和printf的缓冲机制
- 标准IO库的缓冲机制引起的问题
- cout和printf的缓冲机制
- cout和printf的缓冲机制
- linux下printf实现不换行打印(printf显示不加换行的缓冲问题)
- fork与printf缓冲问题
- printf()函数的行缓冲问题
- linux编程中printf显示不加换行的缓冲问题
- 一道C语言面试题printf输出问题,高手们都来看看吧
- 关于Session的机制,实现方式和安全、单点故障问题
- 使用printf修改变量的值 —— VS2008中使用%n输出遇到的问题及解决方法
- Visual Studio 2012 未找到与约束 ContractName问题,及printf unsafe问题
- printf到控制台相关问题