C99标准具有整数类型,字节大小类似于int64_t。 我使用以下代码:

#include

#include

int64_t my_int = 999999999999999999;

printf("This is my_int: %I64d

", my_int);

我得到这个编译器警告:

warning: format ‘%I64d’ expects type ‘int’, but argument 2 has type ‘int64_t’

我尝试过:

printf("This is my_int: %lld

", my_int); // long long decimal

但我得到同样的警告。 我正在使用这个编译器:

~/dev/c$ cc -v

Using built-in specs.

Target: i686-apple-darwin10

Configured with: /var/tmp/gcc/gcc-5664~89/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1

Thread model: posix

gcc version 4.2.1 (Apple Inc. build 5664)

我应该使用哪种格式打印my_int变量而不发出警告?

对于C ++,请参阅stackoverflow.com/questions/8132399/how-to-printf-uint64-t

对于int64_t类型:

#include

int64_t t;

printf("%" PRId64"

", t);

对于uint64_t类型:

#include

uint64_t t;

printf("%" PRIu64"

", t);

您也可以使用PRIx64以十六进制打印。

cppreference.com包含所有类型的可用宏的完整列表,包括intptr_t(PRIxPTR)。 scanf有单独的宏,如SCNd64。

PRIu16的典型定义是"hu",因此隐式字符串常量级联在编译时发生。

要使代码完全可移植,必须使用PRId32等打印int32_t,"%d"或类似打印int。

格式化宏常量的完整列表:en.cppreference.com/w/cpp/types/integer

请注意,这不是"%PRId64 n",而是字符串连接...

而且,如果在Linux上使用C ++,请确保在包含inttypes.h之前#define __STDC_FORMAT_MACROS。

PRId64是一个内部转换为"lld"的宏。所以,它与编写printf("%lld

", t);一样好请参阅说明:qnx.com/developers/docs/6.5.0/

@Gaurav,这在某些平台上是正确的,但不是全部。例如,在我的amd64 Linux机器上,PRId64被定义为ld。可移植性是宏的原因。

我认为通过一些额外的努力,他们可能会使它更加令人讨厌

显然gcc集合的头代码不匹配,导致PRId64在64位linux上定义为"ld",在32位上定义为"lld",这是不正确的。

C99的方式是

#include

int64_t my_int = 999999999999999999;

printf("%" PRId64"

", my_int);

或者你可以投!

printf("%ld", (long)my_int);

printf("%lld", (long long)my_int); /* C89 didn't define `long long` */

printf("%f", (double)my_int);

如果你坚持使用C89实现(特别是Visual Studio),你可以使用开源(和):http://code.google.com/p/msinttypes/

在code.google.com链接中使用msinttypes时,我需要定义__STDC_FORMAT_MACROS。请参阅stackoverflow.com/questions/8132399/how-to-printf-uint64-t。

谢谢你的抬头,@ariscris。看起来只有C ++才需要宏。链接到的代码中的定义位于#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)内

使用C99,%j长度修改器也可以与printf系列函数一起使用,以打印int64_t和uint64_t类型的值:

#include

#include

int main(int argc, char *argv[])

{

int64_t  a = 1LL << 63;

uint64_t b = 1ULL << 63;

printf("a=%jd (0x%jx)

", a, a);

printf("b=%ju (0x%jx)

", b, b);

return 0;

}

使用gcc -Wall -pedantic -std=c99编译此代码不会产生警告,程序将打印预期的输出:

a=-9223372036854775808 (0x8000000000000000)

b=9223372036854775808 (0x8000000000000000)

这是根据我的Linux系统上的printf(3)(手册页明确指出j用于表示转换为intmax_t或uintmax_t;在我的stdint.h中,int64_t和以完全相同的方式进行typedef,对于uint64_t类似。我不确定这是否完全可以移植到其他系统。

如果%jd prnts intmax_t,则正确的调用将是printf("a=%jd (0x%jx)", (intmax_t) a, (intmax_t) a)。无法保证int64_t和intmax_t是相同的类型,如果不是,则行为未定义。

如果在将它们传递给printf之前将它们显式转换为intmax_t,则可以移植使用%jd来打印int64_t值:printf("a=%jd

", (intmax_t)a)。这避免了(恕我直言)宏的丑陋。当然,这假设您的实现支持%jd,int64_t和intmax_t,所有这些都是由C99添加的。

来自嵌入式世界,甚至uclibc并不总是可用,代码就像

uint64_t myval = 0xdeadfacedeadbeef;

printf("%llx", myval);

是打印废话或根本不工作 - 我总是使用一个小助手,允许我正确转储uint64_t十六进制:

#include

#include

#include

char* ullx(uint64_t val)

{

static char buf[34] = { [0 ... 33] = 0 };

char* out = &buf[33];

uint64_t hval = val;

unsigned int hbase = 16;

do {

*out ="0123456789abcdef"[hval % hbase];

--out;

hval /= hbase;

} while(hval);

*out-- = 'x', *out = '0';

return out;

}

在Windows环境中,使用

%I64d

在Linux中,使用

%lld

%lld是long long int的格式,不一定与int64_t相同。 有一个宏,用于int64_t的正确格式;看到ouah的回答。

@KeithThompson但是,由于long long至少为64位,printf("%lld", (long long)x);应该可以工作,除了-0x8000000000000000,如果该类型不使用二进制补码,则无法表示为long long。

@PascalCuoq:是的,它应该与强制转换一起工作(你提到的异常是非常不可能的,只适用于支持二进制补丁但不用于long long的系统)。

//VC6.0(386及更高)

__int64 my_qw_var = 0x1234567890abcdef;

__int32 v_dw_h;

__int32 v_dw_l;

__asm

{

mov eax,[dword ptr my_qw_var + 4]   //dwh

mov [dword ptr v_dw_h],eax

mov eax,[dword ptr my_qw_var]   //dwl

mov [dword ptr v_dw_l],eax

}

//Oops 0.8 format

printf("val = 0x%0.8x%0.8x

", (__int32)v_dw_h, (__int32)v_dw_l);

问候。

linux printf int64,关于stdint:如何在C中打印int64_t类型相关推荐

  1. c语言中int64类型,stdint - 如何在C中打印int64_t类型

    stdint - 如何在C中打印int64_t类型 C99标准具有整数类型,字节大小类似于int64_t. 我使用以下代码: #include #include int64_t my_int = 99 ...

  2. c语言int t格式,如何在C中打印int64_t类型

    C99标准具有整数类型,字节大小类似int64_t.我使用下面的代码: #include #include int64_t my_int = 999999999999999999; printf(&q ...

  3. python打印多个变量名_如何在Python中打印单个和多个变量?

    请考虑下面Python 2.x中的两个Python代码片段.# Code 1 print 1 # Output: 1# Code 2 print(1) # Output: 1 在Python 2.X中 ...

  4. Microsoft Excel 教程「3」:如何在 Excel 中打印工作表?

    欢迎观看 Microsoft Excel 教程,小编带大家学习 Microsoft Excel 的使用技巧,了解如何在 Excel 中打印工作表. 可打印全部或部分工作表,可一次打印一个,也可一次打印 ...

  5. 如何在 IIS 中添加 MIME 类型

    MIME 类型用于查找特定文件类型的管理方式,它指示文件的性质和格式. 今天,让我们详细了解一下如何在 IIS 中添加 MIME 类型. 什么是 MIME 类型? MIME(多用途 Internet ...

  6. linux扫描hba卡命令,如何在redhat中查看HBA卡的信息

    如何在redhat中查看HBA卡的信息 发布时间:2020-06-04 15:20:59 来源:亿速云 阅读:1063 作者:Leah 如何在redhat中查看HBA卡的信息?针对这个问题,今天小编总 ...

  7. 如何在 C# 中使用匿名类型

    匿名类型是一种没有名字的类型,可以使用 匿名类型 实现在一个类中定义一组只读属性,????????的是,这个类你不需要预先定义,本篇就来讨论下 匿名类型 是什么?为什么这么重要?如何在 C# 中使用好 ...

  8. 如何在Python中打印到stderr?

    有几种写stderr的方法: # Note: this first one does not work in Python 3 print >> sys.stderr, "spa ...

  9. linux程序计数器,如何在C中打印程序计数器的确切值

    小编典典 您应该能够使用ARM编译器工具链中的__current_pc()内在函数来确定PC (ARM编译器支持许多与GCC相同的扩展).*这是ARM特有的: int main () { printf ...

最新文章

  1. PostgreSQL 压缩包 在win7上安装
  2. .net core2.0 Memcached.ClientLibrary
  3. 重磅公开!阿里语音识别模型端核心技术,让你“听”见未来
  4. Extjs中renderer:function函数用法
  5. Hadoop权威指南(第三版)笔记——MapReduce
  6. 3U VPX导冷高性能SRIO/以太网数据交换板
  7. Sketch 52.2 macOS 破解版 汉化插件
  8. 你技术这么好,总要改变点什么把!
  9. 数据结构-指针和结构体
  10. 记一次生产事故排查——CPU高负载原因排查分析
  11. JVM(6)之 二次标记
  12. android-手势密码
  13. 4.7 设置单元格中文本的行间距 [原创Excel教程]
  14. 中国艺术《无有中无尽藏》孙溟㠭篆刻
  15. 【最全】Spring Boot 实现分布式锁——这才是实现分布式锁的正确姿势!
  16. android 签名文件与sha1获取
  17. node-telegram-bot-api 基于Nodejs的TG机器人
  18. 《幼儿园门禁管理系统可行性研究报告》
  19. 初识二维码 第二讲 二维码的结构
  20. 人工智能课程必背知识点

热门文章

  1. SoriTong1.0漏洞分析
  2. 10个你不知道的AirPods 2隐藏使用技巧
  3. 小程序 U你caughtSyntax Error: Invalid or Unexpected token: 1: 2154
  4. 我用段子讲.NET之依赖注入其二
  5. 浦发银行长沙分行党委书记、行长王起,华融湘江银行行长蒋俊文一行莅临麒麟信安调研考察
  6. 说说使用nose、noes2、pytest感受
  7. Authenticator 备份密钥/导出
  8. 5G前传、中传、回传应用中的光模块
  9. CNKI E-Study系统崩溃问题:
  10. 集成灶十大名牌排行榜,集成灶什么牌子的质量比较好?