int64_t 的格式化打印

ALOGD("transfer gps nmea get parameters: gpsUtcTimestamp=%ld, nmea=%s, length=%d",

                                gpsUtcTimestamp, nmea_tmp, length);

报错:

 error: format specifies type 'long' but the argument has type 'int64_t' (aka 'long long') [-Werror,-Wformat]


所以在32位机器上就应该是%lld, 在64位机器上应该是%ld ,

那么如何统一写呢。

如何判断系统是32还是64位的呢:

代码中:

#if __WORDSIZE == 64

#endif

 

脚本中:

if [ `getconf LONG_BIT` -eq 64 ];then

64位处理逻辑

else

32位处理逻辑

fi


不过有更好办法:

参考:http://blog.163.com/hevensun@126/blog/static/20153363201311257829882/

#include <inttypes.h>

    ALOGD("transfer gps nmea get parameters: gpsUtcTimestamp=%"PRId64", nmea=%s, length=%d",

                                gpsUtcTimestamp, nmea_tmp, length);

报错:

error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wreserved-user-defined-literal]

                        ALOGD("transfer gps nmea get parameters: gpsUtcTimestamp=%"PRId64", nmea=%s, length=%d",


==》 PRId64前面应该还有个空格,不要忘记。这样就好了。

ALOGD("transfer gps nmea get parameters: gpsUtcTimestamp=%" PRId64", nmea=%s, length=%d",
                                gpsUtcTimestamp, nmea_tmp, length);



<think>好的,用户想了解如何在C语言中打印int64_t类型的数据。我需要先回忆一下C语言中处理固定宽度整数类型的方法。 首先,int64_t是C99标准引入的,定义在<stdint.h>头文件中。为了使用它,必须包含这个头文件。不过,用户可能已经知道这一点,但还是要提一下,确保正确包含头文件。 接下来,打印int64_t需要使用正确的格式说明符。C语言中不同平台的基础类型可能不同,比如在32位和64位系统中,long和long long的长度可能不一样。所以,C99引入了宏来确保可移植性,比如PRId64用于有符号的64位整数,PRIu64用于无符号的。 那问题来了,用户可能不知道这些宏的存在,或者忘记正确的用法。需要指出,应该使用inttypes.h头文件中的宏,因为PRId64等宏定义在这里,而不仅仅是stdint.h。所以,正确的步骤是包含<inttypes.h>,然后使用PRId64作为格式字符串中的说明符。 然后,例子很重要。比如,声明一个int64_t变量并赋值,然后用printf打印。例如: int64_t num = 123456789012345LL; printf("%" PRId64 "\n", num); 这里要注意,PRId64前面的%需要拼接,因为宏展开后是字符串,比如在Linux下可能是"lld",在Windows下可能是"I64d"。这样写可以保证跨平台兼容性。 用户可能会有疑问,为什么不用%lld或者%I64d?这时候需要解释不同平台下的差异,比如在Windows下,64位整数的格式说明符是I64d,而在其他平台是lld。使用PRId64宏可以自动适配,提高代码的可移植性。 另外,还要注意变量的初始化,确保后缀正确,比如使用LL后缀,因为int64_t通常是long long类型。不过,具体实现可能有所不同,但使用宏的话,编译器会处理这些细节。 还需要提醒用户,如果忘记包含inttypes.h,可能会导致编译错误,比如PRId64未定义。所以必须确保两个头文件都被包含,即#include <stdint.h>和#include <inttypes.h>,不过实际上inttypes.h可能已经包含了stdint.h,但为了安全,可以都写上。 总结步骤:包含头文件,使用正确的格式宏,正确初始化变量,并在printf中使用拼接的格式字符串。这样就能正确打印int64_t类型的变量了。</think>在C语言中打印`int64_t`类型变量时,需遵循以下步骤: --- ### **1. 包含头文件** ```c #include <stdio.h> #include <stdint.h> // 定义int64_t #include <inttypes.h> // 提供PRId64格式宏 ``` --- ### **2. 使用正确的格式说明符** `int64_t`的打印格式由宏`PRId64`定义: - **Windows/MinGW**:`PRId64`展开为`"I64d"` - **Linux/macOS**:`PRId64`展开为`"lld"` 通过`PRId64`可保证跨平台兼容性。 --- ### **3. 示例代码** ```c int64_t num = 123456789012345LL; // 注意LL后缀表示long long类型 printf("十进制输出: %" PRId64 "\n", num); printf("十六进制输出: %016" PRIx64 "\n", num); ``` **输出结果**: ``` 十进制输出: 123456789012345 十六进制输出: 00007048815dcd59 ``` --- ### **4. 关键点** - **格式字符串拼接**:`"%" PRId64`会被预处理器拼接为`"%lld"`或`"%I64d"`。 - **后缀LL**:初始化`int64_t`时,使用`LL`后缀确保类型正确。 - **跨平台性**:`PRId64`和`PRIx64`自动适配不同系统的格式要求。 --- ### **常见错误** 1. **忘记包含头文件**:导致`PRId64`未定义。 2. **错误使用格式符**:如直接写`%lld`或`%I64d`,会失去跨平台性。 3. **忽略LL后缀**:可能导致整数溢出或类型不匹配。 通过上述方法,可安全且可移植地打印`int64_t`类型变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卜溪大人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值