今天在参数打印的时候,遇到了一点小问题,打印值和函数参数的传递值不一致。既然遇到问题了,那就静下心来好好的来解决问题,不管问题的大小。
问题来源:
函数参数类型 loff_t,打印时printf输出格式%x,结果不仅参数值打印错误,而且同一printf后面的值也全部打印错误。
解决:
首先这个loff_t到底是个什么数据类型要搞清楚,不断跟踪,它的最终定义为long long,这样问题的根源找到了。下面列出一些打印的常识:
1、各数据类型所占字节
32位系统下,int、long、long long所占字节数和取值范围
字节数
char: 1字节(8位)
int: 4字节 (32位,取值范围 -2^31 ~ 2^31-1)
unsigned int : 4字节 (32位,取值范围 0 ~ 2^32-1)
long: 4字节 (32位,取值范围 -2^31 ~ 2^31-1)
unsigned long : 4字节 (32位,取值范围 0 ~ 2^32-1)
long long : 8字节(64位,取值范围 -2^63 ~ 2^63-1)
取值范围
int : -2147483648 ~ 2147483647
unsigned int : 0 ~ 4294967295
long : -2147483648 ~ 2147483647
unsigned long : 0 ~ 4294967295
long long : -9223372036854775808 ~ 9223372036854775807
unsigned long long : 0 ~ 1844674407370955161
2、printf输出格式化
在printf中%d用于int或者比int小的整数类型。比int小的类型被转型成int。
%ld用于long类型,%lld用于long long类型。
%x标识的数会被当成int进行读取,所以long long类型的数如果超过int的范围会被截断,得不到正确的结果。而且因为它多占了4个字节,还会影响后面的其它标识符的输出。
另外%f标识的数会被当成double读取,即取出8个字节读取。
本文探讨了在使用loff_t类型数据时遇到的问题,特别是当使用%x作为printf的输出格式时导致的数据截断和后续输出错误。文章详细解释了loff_t的实际定义,并提供了正确的打印方法。

1163

被折叠的 条评论
为什么被折叠?



