C: printf with typedef unsigned long long int。

问题描述 投票:0回答:1

我有一个类型定义,其中包含一个64位的十六进制内存地址,但使用的是 %xprintf 给了我以下错误。

error: format '%x' expects argument of type 'unsigned int', but argument 4 has type 'address'\

这是我对 typedef 的声明。

typedef unsigned long long int address;

我怎样才能打印出这个十六进制值?谢谢!

编辑:内存地址不是指针,我是从另一个文件中读取十六进制值,需要使用我定义的 typedef 将这些 64bit 地址以数字方式存储。

c++ c printf typedef
1个回答
4
投票

%x 转换指定器希望其对应的参数具有类型为 unsigned int. 要打印一个 unsigned long long,你需要使用长度修饰符 ll%llx.

便利表

Length Modifier        Type
–––––––––––––––        ––––
             ll        (unsigned) long long
              l        (unsigned) long
              h        (unsigned) short
             hh        (unsigned) char
              j        intmax_t, uintmax_t
              z        size_t
              t        ptrdiff_t
              L        long double

因此,要格式化一个 unsigned char 值为十六进制,你可以用 %hhx%hhX. 要格式化一个 short 作为小数,你会用 %hd. 要格式化一个 unsigned long 作为八进制,你会用 %lo.

无理取闹

你刚才已经说明了为什么我倾向于避免使用的是 typedef 基元类型的设施。

你已经创建了一个叫做 漏网之鱼 - 你表面上创建了一个新的类型来表示一个地址值,但你必须知道它已经被实现为一个 unsigned long long 才能正确使用它。

如果你要创建一个抽象类型,你需要为该类型的所有操作,包括输入和输出(以及赋值和验证等)创建抽象(函数、宏等)。

一般来说,对于原始类型来说,这样做是不值得的,所以我会避免使用 typedef 为此目的。

© www.soinside.com 2019 - 2024. All rights reserved.