1、使用printf應當說是類型不安全的。是以才引入了C++的流輸入輸出。
比如:
#include "stdint.h"
#include "iostream"
using namespace std;
int main()
{
int64_t a = 1;
int b = 2;
uint32_t uin = 1;
printf("%p %p\n", &a, &b);
printf("%llu\n", uin);
cout << a << " "<< b << endl;
printf("%d %d\n", a, b);
return 0;
}
輸出是:
0xbfd831e0 0xbfd831dc
13823853877176303617 //error
1 2
1 0 //error
可以看到,uint32_t類型,我們用lld時,出現了錯誤,因為printf是根據類型,從起始位址偏移類型個位元組進行讀取資料。
使用C++中的流便不會出現這個問題。在跨平台中,應當引起注意。
2、類型與位元組數【3】
%ld:long int, 32位平台4 bytes
%lld: long long int, 32位平台8 bytes
%lf:double
**************
typedef signed char int8_t
typedef short int int16_t;
typedef int int32_t;
# if __WORDSIZE == 64
typedef long int int64_t;
# else
__extension__
typedef long long int int64_t;
#endif
參考:
【3】 類型與位元組數
<a href="http://blog.sina.com.cn/s/blog_4b9eab320100sdex.html">http://blog.sina.com.cn/s/blog_4b9eab320100sdex.html</a>
【4】 printf實作的探究
<a href="http://www.cnblogs.com/hnrainll/archive/2011/08/05/2128496.html">http://www.cnblogs.com/hnrainll/archive/2011/08/05/2128496.html</a>