__int64的printf问题!(转:http://blog.chinaunix.net/u/19782/showart_403061.html)

本文介绍了一种跨平台(__int64)输出的方法,适用于Windows和Linux环境。通过预处理指令定义不同类型的整数,并使用特定的格式字符串来解决不同平台间的输出差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

__int64的printf问题!

把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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值