原来学的是C++,所以对C语言中的fprintf并不熟悉,一点点积累吧

今天遇到的问题是将数据按照十六进制的方式写入到文件中

int fprintf(FILE *stream, const char *format, ...)

第二个参数为“%x”时为按照十六进制输出,由于我输出的数是short型的,占两个字节,即4位十六进制,应写为“%04x”

但结果输出的数据中产生“FFFFFFFF”,怎么回事?因为fpritnf 是个变参函数,除了前面两个参数之外,后面的参数都不是类型安全的,函数更没有办法仅仅通过一个“%X”就能得知当初函数调用前参数压栈时被压进来的到底是个4 字节的整数还是个2 字节的短整数,所以采取了统一4 字节的处理方式,导致参数压栈时做了符号扩展,扩展成了32 位的整数-1,打印时4 个位置不够了,就把32 位整数-1 的8 位16 进制都打印出来了。

如果你想看数据的本来面目,那么就应该让编译器做0 扩展而不是符号扩展(扩展时二进制左边补0 而不是补符号位):只要将需要输出到文件中的数据由short型强制转换为unsign short即可。

还可以按8 进制打印整数字符串,使用”%o”。注意8 进制和16 进制都不会打
印出负数,都是无符号的,实际上也就是变量的内部编码的直接的16 进制或8 进制表示。