天天看點

24、printf跨平台,資料類型與輸出類型要比對

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>

繼續閱讀