如何以十六进制形式打印一个 uint64_t?

5 浏览
0 Comments

如何以十六进制形式打印一个 uint64_t?

C99标准具有像int64_t这样的字节大小的整数类型。我目前正在使用Windows的%I64d格式(或无符号%I64u),如下所示:\n

#include 
#include 
int64_t my_int = 999999999999999999;
printf("这是我的整数: %I64d\n", my_int);

\n但是我得到了这个编译器警告:\n

警告:格式‘%I64d’期望类型‘int’,但参数2的类型为‘int64_t’

\n我尝试了:\n

printf("这是我的整数: %lld\n", my_int); // long long 十进制

\n但是我得到了相同的警告。我正在使用这个编译器:\n

~/dev/c$ cc -v
使用内建规范。
目标:i686-apple-darwin10
配置为:/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
线程模型:posix
gcc版本4.2.1(Apple Inc. build 5664)

\n在没有警告的情况下,我应该使用什么格式来打印my_int变量?

0
0 Comments

如何将uint64_t作为十六进制打印?

问题的出现:

在C99中,printf函数族可以使用%j长度修饰符打印int64_t和uint64_t类型的值。但是,如果使用%jd打印intmax_t,则行为是未定义的,因为int64_t和intmax_t不一定是相同的类型。

解决方法:

可以在传递给printf之前将int64_t显式转换为intmax_t,从而可以使用%jd来打印int64_t的值。这样可以避免使用宏,但是需要确保实现支持%jd、int64_t和intmax_t,这些都是C99中添加的。

以下是讨论中的一些评论:

- 宏使得可以在不转换为更宽的类型的情况下打印这些类型的值,这在某些情况下可能会有显著的性能影响。

- 不转换为[u]intmax_t可能在某些系统上开销很大。

- 没有更好的方法在不改变语言的情况下实现相同的效果。

讨论中还提到了一些关于宏的不满和提出了一些更好的选择,但这些选择可能无法覆盖奇怪的系统。

最后,可以推断出,尽管宏的确有些丑陋,但是在保证性能的同时,避免了引入更多的长度修饰符,并且在编译时解析为已支持的修饰符。

0
0 Comments

问题的出现原因:这个问题的出现是因为在C语言中,要将uint64_t类型的变量以十六进制的形式打印出来,需要使用特定的格式化字符串。

解决方法:有多种解决方法可以实现将uint64_t类型打印为十六进制的需求。

方法一:使用C99标准的方法。首先要包含头文件#include <inttypes.h>,然后使用printf函数打印变量并指定格式化字符串为"%" PRId64 ",其中PRId64是一个宏定义,用于表示64位有符号整数。

方法二:使用类型转换。可以将uint64_t类型的变量强制转换为其他类型,然后使用对应类型的格式化字符串进行打印。比如可以使用printf("%ld", (long)my_int)将变量转换为long类型进行打印,或者使用printf("%lld", (long long)my_int)将变量转换为long long类型进行打印。需要注意的是,在C89标准中,没有定义long long类型,所以需要根据具体情况选择适当的类型进行转换。

方法三:对于只能使用C89标准的实现(比如Visual Studio),可以使用开源的<inttypes.h><stdint.h>库来解决问题。可以从http://code.google.com/p/msinttypes/链接下载这个库。使用这个库时,需要在代码中定义__STDC_FORMAT_MACROS宏。具体可以参考stackoverflow.com/questions/8132399中的讨论。

通过以上几种方法,我们可以在C语言中将uint64_t类型的变量以十六进制的形式打印出来。具体可以根据不同的需求和编译环境选择合适的方法来解决问题。

0
0 Comments

如何将uint64_t以十六进制形式打印出来?

在C语言中,可以使用inttypes.h头文件中的宏来打印不同类型的整数。对于int64_t类型,可以使用PRId64宏来打印,示例如下:

#include 
int64_t t;
printf("%" PRId64 "\n", t);

对于uint64_t类型,可以使用PRIu64宏来打印,示例如下:

#include 
uint64_t t;
printf("%" PRIu64 "\n", t);

也可以使用PRIx64宏来以十六进制形式打印。cppreference.com网站上有一个完整的宏列表,包括intptr_t类型的宏(如PRIxPTR)。scanf函数也有相应的宏,如SCNd64。

为了使代码具有完全的可移植性,必须使用PRId32等宏来打印int32_t等类型,使用"%d"等格式来打印int类型。

完整的格式化宏常量列表可以在en.cppreference.com/w/c/types/integer中找到。

在Linux上使用C++时,在包含inttypes.h头文件之前,务必使用#define __STDC_FORMAT_MACROS来定义。

PRId64是一个宏,内部将其转换为"lld"。因此,它相当于写printf("%lld\n", t)。具体描述可以查看qnx.com/developers/docs/6.5.0/...。

这在一些平台上是正确的,但并不适用于所有平台。例如,在我的amd64 Linux机器上,PRId64被定义为"ld"。宏的目的是为了实现可移植性。

在某些平台上,long在32位Linux系统上有32位,在64位Linux系统上有64位。这就是为什么PRId64分别为"lld"和"ld"的原因。这样做可以使long long比long更长。在视力短视的平台上,即使在64位系统上,long仍然有32位,这使得PRId64在两种架构上都是"%lld"。

这取决于配置。在我处理过的所有64位发行版中,long为32位,但不能依赖于此。必须依赖于保证大小的类型和宏。"lld"格式根本不具备可移植性,不是所有编译器都支持它。

为什么不只使用%ld(长整型)来打印int64_t和unit64_t?

因为long没有保证为64位。

在无符号类型上也不应使用%ld(或包含d的任何指示符)。相应的指示符是%lu。注意原因:在所有现代平台上,printf("%ld\n", ULONG_MAX)将打印-1;显然,负数不是unsigned long的最大值。C在运行时对printf的参数类型没有任何信息,除非你给它。格式指示符同时告诉所需的输出格式和提供的参数类型。使用错误的格式指示符可能在某些平台上起作用,但在其他平台上会导致错误,使得程序不具备可移植性。

更多信息请参考en.cppreference.com/w/c/types/integer。

0