注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

不透明的雾的博客

人生是一次记忆的旅行

 
 
 

日志

 
 
 
 

【转】__int64的printf问题!  

2010-09-03 10:13:06|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
把Linux的东西移植到Windows 下, 问题真是多, 有时候感觉很是奇怪! 今天有遇到了一个!

__int64在Windows下怎么输出的问题? 我还以为是强制转换的时候出问题了, 查了好长时间!

下面是测试代码, 已经通过Windws, Linux两个平台的测试了!

#include <stdio.h>

#ifdef _WIN32
typedef unsigned __int64 uint64_t;
#else
typedef unsigned long long uint64_t;
#endif

typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;

int main(int argc, char *argv[])
{
  uint32_t t321, t322, t323;
  uint64_t t641, t642, t643;
  uint8_t *p;

  uint8_t t[64] =
    {
         0x4E, 0x7C, 0x00, 0x00, 0x00, 0x00,
         0x4E, 0x7C, 0x00, 0x00, 0x00, 0x00,
         0x04, 0x00, 0x00, 0x00, 0x00, 0x00
    };

  printf(
    "sizeof(uint64_t) = %d\n"
    "sizeof(uint32_t) = %d\n"
    , sizeof(uint64_t), sizeof(uint32_t));

   p = t;
   t321 = *(uint32_t *)p; p += 6;
   t322 = *(uint32_t *)p; p += 6;
   t323 = *(uint32_t *)p; p += 6;

  printf("t321[%X].%d t322[%X].%d t323[%X].%d\n"
    , t321, t321, t322, t322, t323, t323);

   p = t;
   t641 = *(uint32_t *)p; p += 6;
   t642 = *(uint32_t *)p; p += 6;
   t643 = *(uint32_t *)p; p += 6;

#ifdef _WIN32
  printf("t641[%I64X].%I64d t642[%I64X].%I64d t643[%I64X].%I64d\n"
    , t641, t641, t642, t642, t643, t643);
#else
  printf("t641[%llX].%lld t642[%llX].%lld t643[%llX].%lld\n"
    , t641, t641, t642, t642, t643, t643);
#endif

   t641 = 0x1122334455667788;

#ifdef _WIN32
  printf("%I64X %I64d \n", t641, t641);
#else
  printf("%llX %lld \n", t641, t641);
#endif

  return 0;
}


/*
Test Env:
     Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
     Microsoft Windows 2000 [Version 5.00.2195]

Result:
     sizeof(uint64_t) = 8
     sizeof(uint32_t) = 4
     t321[7C4E].31822 t322[7C4E].31822 t323[4].4
     t641[7C4E].31822 t642[7C4E].31822 t643[4].4
     1122334455667788 1234605616436508552

--------------------------------------
Test Env:
     gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-47.3)

Result:
     sizeof(uint64_t) = 8
     sizeof(uint32_t) = 4
     t321[7C4E].31822 t322[7C4E].31822 t323[4].4
     t641[7C4E].31822 t642[7C4E].31822 t643[4].4
     1122334455667788 1234605616436508552
*/

在进行移植的时候可能用的上的:
#ifdef _WIN32
# define APR_UINT64_T_HEX_FMT     "llx"
#else
# define APR_UINT64_T_HEX_FMT     "I64x"
#endif

example:
     sprintf(buf, "%" APR_UINT64_T_HEX_FMT, var);

#define HOST_WIDEST_INT_PRINT_DEC       "%I64d"
#define HOST_WIDEST_INT_PRINT_UNSIGNED "%I64u"
#define HOST_WIDEST_INT_PRINT_HEX       "0x%I64x"
  评论这张
 
阅读(1803)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017