注册

CpuDbg x96

查看: 2049|回复: 0
收起左侧

C语言格式化输出64位地址汇总

[复制链接]
发表于 2022-5-24 19:25:49 | 显示全部楼层 |阅读模式
Format Specification Fields: printf and wprintf FunctionsA format specification, which consists of optional and required fields, has the following form:
%[flags] [width] [.precision] [{h | l | I64 | L}]type
Each field of the format specification is a single character or a number signifying a particular format option. The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign is followed by a character that has no meaning as a format field, the character is copied to stdout. For example, to print a percent-sign character, use %%.
The optional fields, which appear before the type character, control other aspects of the formatting, as follows:
type
Required character that determines whether the associated argument is interpreted as a character, a string, or a number (see Table R.3).
flags
Optional character or characters that control justification of output and printing of signs, blanks, decimal points, and octal and hexadecimal prefixes (see Table R.4). More than one flag can appear in a format specification.
width
Optional number that specifies the minimum number of characters output. (See printf Width Specification.)
precision
Optional number that specifies the maximum number of characters printed for all or part of the output field, or the minimum number of digits printed for integer values (see Table R.5).
h | l | I64 | L
Optional prefixes to type-that specify the size of argument (see Table R.6).
---------------------------------------------------------
上面是m$手册上的用法, 我一般也都是按手册上的来用,如下:

[C] 纯文本查看 复制代码
printf("0x%016I64X", xx);


在写64位调试器时, 为了方便查看地址位数,我会在地址中间也就是2^32的位置用 "_" 下划线隔开, 如下:
[C] 纯文本查看 复制代码
printf("%08X_%08X", (DWORD)(xx >> 32), (DWORD)(xx & 0xffffffff));
// 或者
printf("%08X_%08X", (DWORD)(xx >> 32), (DWORD)(xx));


今天在 Zydis开源项目中看到了下面这种用法: (没错,我准备弃用capstonezydis了)
[C] 纯文本查看 复制代码
printf("%016"PRIX64"", xx);


网上查了下
这是一种跨平台的书写方式,主要是为了同时支持32位和64位操作系统。PRId64表示64位整数,在32位系统中表示long long int,在64位系统中表示long int。相当于:

[C] 纯文本查看 复制代码
printf("%" "ld" "\n", value);  //64bit OS
printf("%" "lld" "\n", value);  //32bit OS
// 或者
printf("%ld", value); // 64bit OS  
printf("%lld", value); // 32bit OS



使用前需要包含头文件
#include <inttypes.h>

之前没见过, 感觉挺新颖的, 记录下.
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注册

QQ|Archiver|手机版| CpuDbg x96

GMT, 2024-12-22 05:01 , Processed in 0.062500 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表