printf sprintf 易错点

#include<iostream>

using namespace std;

int main()
{
    long long int a = 0x1200340056007800;
    long long int b = 0xABCDEF;
    long long int c = 0x123456;
    char d = 0x10;
    long long int e = 0xAB00CD00EF00BB00;
    long long int f = 0x112233;
    char str[64];
    printf("%I64d--%I64d--%I64d\n", a , b, c);
    printf("%lld--%lld--%lld\n", a , b, c);
    printf("%llx--%llx--%llx\n", a , b, c);
    printf("%I64x--%I64x--%I64x\n", a , b, c);


    printf("%d--%d--%d\n", a , b, c);
    printf("%x--%x--%x\n", a , b, c);

    
    sprintf(str, "%x--%llx--%llx", d, e, f);
    sprintf(str, "%x--%x--%x", d, e, f);
    printf("%s\n", str);
    while(1);
}


/*********************************************************************************
long long int a = 1;
long long int b = 2;
printf("%d %d\n", a , b);

printf首先把b压栈,然后把a压栈(都是8个字节)。运行时遇到第一个%d,取4个字节,
堆栈在内存中是从高地址向低地址扩展, 由于intel采用小端序,先取出4个字节实际是a的低4个字节。
再遇到一个%d,又取4个字节,实际是a的高4个字节,因此无论b如何变化,第二个%d总是打印0。

“%d”表示按十进制整型输出; int
“%ld”表示按十进制长整型输出; long int
VC下两者数据长度没有区别 都是32bit

printf 输出 long long,使用%I64d 或%lld (注意Windows /Linux区别)
*********************************************************************************/

 

posted @ 2017-04-04 23:10  sinferwu  阅读(286)  评论(0)    收藏  举报