我有一个类型定义,其中包含一个64位的十六进制内存地址,但使用的是 %x
与 printf
给了我以下错误。
error: format '%x' expects argument of type 'unsigned int', but argument 4 has type 'address'\
这是我对 typedef 的声明。
typedef unsigned long long int address;
我怎样才能打印出这个十六进制值?谢谢!
编辑:内存地址不是指针,我是从另一个文件中读取十六进制值,需要使用我定义的 typedef 将这些 64bit 地址以数字方式存储。
在 %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
为此目的。