64位整数用CString格式化显示的困惑
请看下面代码的红字部分
第二句中总显示freq=0
是什么原因造成的? LARGE_INTEGER m_liPerfFreq={0};
 //获取每秒多少CPU Performance Tick
 LARGE_INTEGER m_liPerfStart={0};
 QueryPerformanceCounter(&m_liPerfStart);
 QueryPerformanceFrequency(&m_liPerfFreq);
 
 //..其他简单代码
 
 LARGE_INTEGER liPerfNow={0};
 // 计算CPU运行到现在的时间
 QueryPerformanceCounter(&liPerfNow);
 LONGLONG nx = (liPerfNow.QuadPart - m_liPerfStart.QuadPart);
 LONGLONG time=( nx /m_liPerfFreq.QuadPart);
 CString _str; 
 LONGLONG u = (m_liPerfFreq.QuadPart);
 TCHAR _sz[64]={0};
 _str.Format(_T("freq = %I64d delta = %d time = %dus\n"),u,nx,time);//这一句能正确显示
 _str.Format(_T("delta = %d, time = %dus, freq = %I64d"), nx, time,  u);//这一句尾部显示freq = 0

解决方案 »

  1.   

    代码有问题,楼主变量都是64位数,而(_T("freq = %I64d delta = %d time = %dus\n"),,第1参数64位,函数能正确解释,并定位到正确的nx,但是("delta = %d, time = %dus, freq = %I64d"), 函数吧第一个参数当32位,第2个也当32位,所以参数解释错位了,如果用下面的语句,还是能正确的
    _str.Format(_T("delta = %d, time = %dus, freq = %I64d"), (int)nx, (int)time, u);
      

  2.   

    LONGLONG等都要用%I64d,不然字符串格式化的时候会处理到后面,造成64位只读取32为等