揭秘C语言中printf格式化输出十六进制的5大陷阱及正确用法

专科C语言国赛实战指南:Code::Blocks环境下的字符串、结构体与文件读写 C语言基础能力是计算机类专科生的核心工程素养,其本质在于对内存布局、标准库函数行为及开发环境约束的深度理解。从字符串逆序的换行符处理,到结构体数组的字段对齐与安全复制,再到文件读写中的ANSI编码适配与fopen路径逻辑,每一处细节都体现着C语言‘贴近硬件、显式控制’的设计哲学。这些能力不仅支撑第五届计算机能力挑战赛专科组真题求解,更广泛应用于嵌入式开发、实训项目和PTA平台训练中。尤其在Code::Blocks+MinGW 8.1.0这一受限但真实的教学环境中,掌握fgets边界处理、strncpy截断、 阅读详情

第一章:揭秘C语言中printf格式化输出十六进制的5大陷阱及正确用法

在C语言开发中,printf函数是调试和输出数据的重要工具,尤其在处理底层数据时,常需将整数以十六进制形式输出。然而,使用不当极易引发难以察觉的问题。以下是开发者常遇到的五大陷阱及其正确应对方式。

忽略大小写格式导致输出不符合预期

printf支持%x(小写)和%X(大写)两种十六进制输出格式。若未明确需求,可能导致日志或协议解析错误。
// 使用 %x 输出小写十六进制
printf("小写: %x\n", 255); // 输出: ff
// 使用 %X 输出大写十六进制
printf("大写: %X\n", 255); // 输出: FF

未指定字段宽度导致对齐混乱

当批量输出内存地址或寄存器值时,若不统一宽度,可读性差。应使用最小字段宽度修饰符。
printf("地址: %08X\n", 0xAB); // 输出: 000000AB,补零至8位

误用格式符打印指针或负数

对负数使用%x会将其按无符号处理,可能输出巨大数值;打印指针应使用%p。
  • printf("%x", -1); 实际输出为 ffffffff(32位系统)
  • 正确打印指针:printf("ptr=%p", (void*)&var);

跨平台类型长度差异引发截断

不同平台上int、long长度不同。推荐使用inttypes.h中的固定宽度格式宏。
#include <inttypes.h>
uint32_t val = 0x12345678;
printf("值: %" PRIx32 "\n", val); // 跨平台安全输出

混淆带符号与无符号整型

有符号整型以十六进制输出时,负数会以补码形式展现,易被误解为“异常数据”。
变量值格式符输出结果
-1%xffffffff
255%xff

第二章:理解十六进制输出的基本机制与常见误区

2.1 理解%hx、%x与%lx的区别:从数据类型对齐说起

在C语言中,格式化输出符 `%hx`、`%x` 和 `%lx` 分别对应不同宽度的无符号整型数据,其差异源于底层数据类型的存储对齐与大小。
格式说明符的语义解析
  • %hx:处理短整型(unsigned short),以十六进制输出,占用通常为2字节;
  • %x:默认处理 unsigned int,按平台整型宽度输出十六进制;
  • %lx:针对长整型(unsigned long),适配64位系统下的8字节数据。
代码示例与行为对比
#include <stdio.h>
int main() {
    unsigned short s = 0xABCD;
    unsigned int   i = 0x12345678;
    unsigned long  l = 0x123456789ABCDEF0L;

    printf("%hx\n", s);  // 输出: abcd
    printf("%x\n",  i);  // 输出: 12345678
    printf("%lx\n", l);  // 64位下输出: 123456789abcdef0
    return 0;
}
上述代码展示了不同长度整数在格式化输出时的正确映射。若误用(如用 `%x` 输出 `long`),在64位系统可能导致截断或警告。
数据对齐与可移植性影响
说明符对应类型典型字节宽
%hxunsigned short2
%xunsigned int4
%lxunsigned long8 (64位)
理解这些差异有助于避免跨平台开发中的未定义行为。

2.2 小端与大端系统下printf输出的差异实践分析

在不同字节序的系统中,多字节数据的内存布局方式直接影响 printf 对变量的解析结果。小端系统将低位字节存储在低地址,而大端系统则相反。
字节序差异示例
int value = 0x12345678;
unsigned char *ptr = (unsigned char*)&value;
for (int i = 0; i < 4; i++) {
    printf("Byte %d: 0x%02x\n", i, ptr[i]);
}
上述代码在小端系统输出为:
Byte 0: 0x78, Byte 1: 0x56, ..., 而大端系统为:
Byte 0: 0x12, 明确体现存储顺序差异。
对 printf 输出的影响
当使用 %x 输出指针或联合体内容时,若未考虑字节序,跨平台数据解析将出错。网络协议和文件格式通常采用大端(网络字节序),需通过 htonl 等函数转换以确保一致性。

2.3 无符号与有符号整数混用导致的十六进制误读

在底层编程中,无符号与有符号整数的混用常引发对十六进制数值的误读。尤其在类型转换或比较时,符号扩展可能改变数据的实际解释方式。
符号扩展的影响
当一个8位有符号数 `0xFF`(值为-1)被提升为32位无符号整数时,会进行符号扩展,结果变为 `0xFFFFFFFF`,其无符号值为 4,294,967,295,远超预期。

int8_t a = 0xFF;        // 值为 -1 (有符号)
uint32_t b = a;         // 符号扩展:b = 0xFFFFFFFF (即 4294967295)
printf("b = %u\n", b);  // 输出:4294967295
上述代码展示了从 `int8_t` 到 `uint32_t` 的隐式转换过程。由于原值为负,编译器执行符号扩展,填充高位为1,导致十六进制表示不变但语义剧变。
常见规避策略
  • 使用显式类型转换,明确数据解释方式
  • 避免跨符号类型直接比较
  • 在调试时结合打印有符号和无符号格式辅助判断

2.4 字符串指针误作数值直接输出的典型错误案例

在C语言开发中,常有开发者误将字符串指针当作整数值输出,导致不可预期的结果。这类问题多源于对指针本质理解不足。
常见错误代码示例

#include <stdio.h>
int main() {
    char *str = "Hello";
    printf("str 的值: %d\n", str);  // 错误:使用 %d 输出指针
    return 0;
}
上述代码试图以十进制整数格式(%d)输出指针变量 str,实际打印的是地址的数值表示,而非字符串内容,极易引发误解。
正确处理方式
应使用 %s 格式化输出字符串内容,或用 %p 输出指针地址:

printf("字符串内容: %s\n", str);  // 正确输出内容
printf("指针地址: %p\n", (void*)str);  // 正确输出地址
通过合理选择格式符,可避免语义混淆,提升程序可读性与调试效率。

2.5 printf截断与字长溢出:平台相关性的实际验证

在不同架构平台上,printf的行为可能因字长和调用约定差异而产生截断或溢出。
实验代码设计

#include <stdio.h>
int main() {
    long x = 0x123456789ABCDEF0;
    printf("Value: %lx\n", x); // 注意格式符与实际类型匹配
    return 0;
}
该代码在32位系统上可能导致输出截断,因long为4字节,而64位系统可完整输出16进制值。
平台差异对比
平台long 字节长度输出结果
x86_3249abcdef0
x86_648123456789abcdef0
使用%lx时需确保参数宽度匹配,否则引发不可预测的栈偏移或数据显示错误。

第三章:规避格式说明符使用中的深层陷阱

3.1 使用PRIxPTR等标准宏确保指针安全输出的实践

在跨平台C开发中,直接使用%p格式化输出指针可能导致不可移植或警告。C99标准引入PRIxPTR等宏,定义于<inttypes.h>,用于安全、一致地打印指针值。
标准宏的优势
  • PRIxPTR:以小写十六进制输出uintptr_t类型的指针
  • PRIXPTR:以大写十六进制输出
  • 确保在32位与64位系统上均正确显示指针宽度
代码示例
#include <stdio.h>
#include <inttypes.h>

int main() {
    int value = 42;
    int *ptr = &value;
    printf("Pointer: 0x%" PRIxPTR "\n", (uintptr_t)ptr);
    return 0;
}
上述代码将指针转换为uintptr_t后使用PRIxPTR格式化,避免了%p的实现定义行为,提升可移植性与类型安全。

3.2 结构体成员偏移量以十六进制打印时的对齐问题

在C语言中,结构体成员的偏移量受数据类型对齐规则影响。当使用十六进制打印偏移量时,需注意内存对齐可能导致的“空洞”。
结构体对齐示例

#include <stdio.h>
#include <stddef.h>

struct Example {
    char a;     // 偏移: 0x0
    int b;      // 偏移: 0x4(因对齐填充3字节)
    short c;    // 偏移: 0x8
};
上述代码中,char a 占1字节,但 int b 需4字节对齐,因此编译器在 a 后填充3字节,导致其偏移从0x1跳至0x4。
偏移量验证方法
可使用 offsetof 宏精确获取成员偏移:
  • offsetof(struct Example, a) → 0x0
  • offsetof(struct Example, b) → 0x4
  • offsetof(struct Example, c) → 0x8
此机制揭示了编译器如何根据目标平台的对齐要求优化内存布局。

3.3 可变参数栈错位引发的格式化输出崩溃实验

在C语言中,`printf`类函数依赖正确的格式化字符串与可变参数的匹配。当参数数量或类型不匹配时,可能导致栈指针错位,引发未定义行为。
典型崩溃示例

#include <stdio.h>
int main() {
    int value = 0x12345678;
    printf("Value: %s\n", value);  // 错误:%s期望char*,传入int
    return 0;
}
上述代码中,`%s`要求一个指向字符串的指针,但传入的是整型值。`printf`会将`value`的内容解释为内存地址,尝试访问该地址读取字符串,极大概率触发段错误(Segmentation Fault)。
栈帧影响分析
  • 可变参数函数通过栈传递参数
  • 格式化字符串与实际参数不匹配导致栈偏移计算错误
  • 读取越界或类型误解析,造成崩溃或信息泄露

第四章:构建安全可靠的十六进制调试输出方案

4.1 封装通用十六进制dump函数用于内存内容查看

在调试底层程序或分析内存数据时,直观查看原始字节内容至关重要。为此,封装一个通用的十六进制dump函数能显著提升开发效率。
设计目标与接口定义
该函数需支持任意内存区域输出,每行显示固定字节数,并同时展示十六进制值与可打印字符。Go语言实现如下:
func HexDump(data []byte, width int) {
    for i := 0; i < len(data); i += width {
        end := i + width
        if end > len(data) {
            end = len(data)
        }
        line := data[i:end]
        fmt.Printf("%08x  ", i)
        // 输出十六进制
        for j := 0; j < width; j++ {
            if j < len(line) {
                fmt.Printf("%02x ", line[j])
            } else {
                fmt.Print("   ")
            }
        }
        // 输出字符部分
        fmt.Print(" |")
        for _, b := range line {
            if b >= 32 && b <= 126 {
                fmt.Printf("%c", b)
            } else {
                fmt.Print(".")
            }
        }
        fmt.Println("|")
    }
}
参数说明:`data`为输入字节切片,`width`控制每行显示字节数(通常为16)。函数按地址逐行输出十六进制值与ASCII可视化字符,缺失部分以空格填充,不可打印字符用“.”代替。

4.2 跨平台兼容的格式化宏定义设计与实测

在嵌入式开发中,不同编译器对格式化字符串的处理存在差异。为统一接口,设计跨平台宏可显著提升代码可移植性。
宏定义实现
#define PRIu64 "llu"
#define PRIx64 "llx"
#define PRINTF_64(x) printf("Value: %" PRIu64 "\n", (unsigned long long)(x))
上述宏将 PRIu64 映射为 "llu",适配 GCC 与 MSVC 对 uint64_t 的格式化需求。强制类型转换确保参数宽度一致。
测试结果对比
平台编译器是否通过
LinuxGCC 9.4是
WindowsMSVC 19.2是
FreeRTOSIAR否
IAR 编译器需额外定义 #define __STDC_FORMAT_MACROS 才能生效,已在构建脚本中加入预处理标志。

4.3 避免信息泄露:敏感内存区域的条件性输出控制

在系统开发中,敏感内存区域(如认证令牌、密钥缓存)若未加控制地输出,极易导致信息泄露。必须通过条件性访问机制限制其暴露。
访问控制策略
采用运行时标志位判断是否允许敏感数据输出:
  • 调试模式下可开启日志输出
  • 生产环境强制屏蔽敏感字段
  • 权限校验通过后方可解禁
代码实现示例
func SafeOutput(data []byte, allowSensitive bool) []byte {
    if !allowSensitive {
        return []byte("REDACTED")
    }
    return data
}
该函数接收原始数据与授权标志,仅当 allowSensitive 为真时返回明文,否则以占位符替代,防止意外泄露。
风险等级对照表
数据类型输出许可级别
加密密钥仅限调试
用户凭证禁止输出
会话令牌需动态授权

4.4 结合assert与fprintf实现带上下文的十六进制日志

在调试嵌入式系统或底层通信协议时,需要同时验证数据正确性并输出原始字节流。通过结合`assert`断言与`fprintf`日志输出,可在断言失败时打印带有上下文信息的十六进制数据。
断言与日志协同机制
当检测到非法状态时,先使用`fprintf`将当前缓冲区内容以十六进制格式写入日志文件,再触发`assert(0)`终止程序。

#include <stdio.h>
#include <assert.h>

void log_hex_and_assert(const unsigned char *data, int len, const char *context) {
    FILE *log = fopen("debug.log", "a");
    fprintf(log, "ASSERT TRIGGERED in %s\nData [%d bytes]:\n", context, len);
    for (int i = 0; i < len; ++i) {
        fprintf(log, "%02x ", data[i]);
        if ((i+1) % 16 == 0) fprintf(log, "\n");
    }
    fprintf(log, "\n--- END ---\n");
    fclose(log);
    assert(0);
}
上述函数首先记录上下文和十六进制数据,便于事后分析内存状态,提升故障定位效率。

第五章:总结与最佳实践建议

性能监控与调优策略
在高并发系统中,持续的性能监控是保障稳定性的关键。推荐使用 Prometheus + Grafana 构建可视化监控体系,实时追踪服务响应时间、GC 频率和内存占用。
  • 定期执行压力测试,识别瓶颈点
  • 设置告警阈值,如 CPU 使用率超过 80% 持续 5 分钟触发通知
  • 利用 pprof 分析 Go 服务运行时性能数据
代码可维护性提升技巧
清晰的代码结构能显著降低后期维护成本。以下是一个带注释的 Go 错误处理模式示例:

// validateUserInput 检查用户输入合法性
func validateUserInput(u *User) error {
    if u.Name == "" {
        return fmt.Errorf("用户名不能为空")
    }
    if len(u.Password) < 8 {
        return fmt.Errorf("密码长度至少为8位")
    }
    return nil // 通过校验
}
微服务部署最佳实践
采用 Kubernetes 进行容器编排时,应遵循资源限制与健康检查配置规范。参考如下资源配置表:
服务类型CPU 请求内存限制就绪探针路径
API 网关200m512Mi/health
订单服务300m768Mi/ready
安全加固措施
生产环境必须启用 TLS 加密通信,并对敏感头信息进行过滤。例如,在 Nginx 中配置:

location /api/ {
    proxy_set_header X-Forwarded-For "";
    proxy_set_header X-Real-IP "";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;
}
解密UFS Explorer:Drobo BeyondRAID数据恢复实战指南 本文详细介绍了使用UFS Explorer Professional Recovery软件中的Drobo BeyondRAID助手进行数据恢复的完整实战流程。当Drobo设备因BeyondRAID配置信息丢失而无法访问时,该工具能安全、只读地扫描硬盘,虚拟重建存储池,帮助用户找回宝贵数据。指南涵盖了从前期准备、硬盘选择、配置扫描到数据安全导出的每一步关键操作与常见问题解决方案。 阅读详情

相关推荐

手把手教你用ADIsimCLK和GUI搞定HMC7044时钟配置(附避坑指南)

本文详细解析了HMC7044时钟芯片的配置方法,通过ADIsimCLK和HMC7044 Configuration GUI工具,从频率规划到硬件验证全流程实战演示。特别针对PLL模式选择、分频链配置等易错环节,提供量产验证的配置模板和实测数据,帮助工程师快速掌握高性能时钟解决方案。

weixin_30755393的博客 806

C语言printf输出十六进制16进制

#include <stdio.h> int main() { short a = 0b1010110; //二进制数字 int b = 02713; //八进制数字 long c = 0X1DAB83; //十六进制数字 printf("a=%ho, b=%o, c=%lo\n", a, b, c); //以八进制形似输出 printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出 .

纸带的博客 11万+

每天10分钟,混剪视频Agent产出50条爆款,单月变现6位数(喂饭级教程)

混剪视频是指将多个视频片段、图片或音频素材进行剪辑组合,创造出新的视频内容。随着Coze上线联动剪映功能,混剪视频制作正在进入自动化时代,为创作者带来巨大便利。高效自动化处理:AI可以自动完成琐碎的剪辑工作,让创作者省下大量时间专注于项目策划和创意。批量素材产出:特别适用于抖音、小红书和视频号等平台上的养生、科普、心理、疗愈等垂直领域,可以自动化批量生产图片和视频素材。引流获客:通过优质内容吸引目标受众知识变现:通过教学传授技术工具变现:将搭建好的工作流作为产品销售。

汤师爷的博客 866

c语言 - printf函数打印16进制格式数据

使用printf 输出16进制的格式化数据,例如输入 0x0A。这种方式对0x00无效,

-凌凌漆-的博客 1万+

android技术--------如何解决弹出键盘只影响当前fragment输入的窗口

题目比较长,也可能有很多人不明所以这东西有啥可写的,简单来说就是实现近似于Android Pad 上QQHD聊天的界面效果,搞了很长的事件,今天终于搞定。 android3.0新加了组件Fragment称之为碎片,对这个一无所知的请自觉补习。今天的阐述将基于此组件。 fragment可以放入activity中,并随activity的生命周期变化而变化,但当相应键盘事件的时候,就比较让人挠头了,

3507

在abaqus中利用point-based 来快捷定义螺栓连接

abaqus中可以通过point-based方式定义连接点的位置,并对连接方式进行定义,可以进行螺栓连接的模拟。 可以通过逐点输入坐标或导入外部的坐标位置 也可以通过阵列的方式定义点 定义完点后就利用create fasteners,选择point-based,选取刚才创建好的点阵列,然后定义连接的属性,如下图 定义connector section时,类型选择translator,相当于只有1方向可以动,定义弹性模量以及破坏准则。 案例操作 假如有两个板,通过...

fiber_tape的博客 7340

c语言打印地址的格式错误,正确的格式说明符打印指针或地址?

Jonathan Lef..213最简单的答案,假设您不介意不同平台之间的变幻莫测和格式变化,是标准%p符号.C99标准(ISO/IEC 9899:1999)在§7.19.6.18中说:p参数应该是指针void.指针的值以实现定义的方式转换为打印字符序列.(在C11 - ISO/IEC 9899:2011中 - 信息在§7.21.6.18中.)在某些平台上,这将包括一个领先,0x而在其他平台上...

weixin_29406875的博客 884

M6 Mac mini涨价2500值不值?深度拆解硬件成本与购买决策

统一内存架构将CPU、GPU和内存封装在一起,通过共享高带宽内存池提升数据交换效率,尤其适合本地AI推理和视频渲染等场景。在苹果生态中,起步内存和存储的配置直接决定设备生命周期,因为后期无法自行升级。M6 Mac mini将起步内存从16GB提升至24GB、存储从256GB提升至512GB,同时芯片制程和GPU核心数均有升级,持续负载性能保持率明显改善。对于开发者、内容创作者和本地大模型推理用户,这些变化能转化为实际效率收益;而轻度办公用户则可能面临性能冗余。理解硬件成本结构与自身工作流需求,才能判断这25

weixin_30846347的博客 267

printf十六进制格式打印

但是,这种方法并不能直接打印出负号,因为十六进制数本身是无符号的。所以,你需要先检查这个数是否小于0,如果是的话,再打印出负号和它的绝对值。函数的一个格式说明符,用于以十六进制形式打印整数,并且在打印的结果前面添加。在C语言中,如果你想打印一个负的十六进制数,你可以使用。是否小于0,如果是的话,就打印出负号,并将。是一个标志,表示在打印的结果前面添加。这样,你就可以看到输出是。,这是255的十六进制表示。表示以十六进制形式打印整数。函数中,它创建了一个变量。表示这是一个格式说明符,例如,如果你有一个整数。

我的博客 4761

JS+H5打字练习器

实现功能 1.导入.TXT文件到打字练习内容(部分浏览器可能出于安全问题限制了这一步操作) 2.输入文本到打字练习内(弹出输入框,将要练习的内容输入至输入框) 3. 开始练习,并根据正误在打字练习内容文本上修改颜色(某个字正确显示绿色,某个字错误,显示红色,某个字没有打显示灰色) 4.开始练习、结束练习,全部输入完成后自动结束练习,也可提前手动结束练习,结束练习后弹窗用显示时和正确率。(区别在于一个全部输入完成且全部正确,一个提前结束无其他条件) 效果图 分析 HTML 结构解析 根元素:<!DO

w11111xxxl的博客 1414

基于泰勒展开改进的物理信息神经网络

基于泰勒展开改进的物理信息神经网络

天天酷科研的博客 504

c++标准库(c++ primer plus笔记)

它是一个广义指针。实际上,也可以是指针,也可以是一个可对其执行类似指针的操作——如解除引用(如operator*())和递增(如operator++())——的对象。通过将指针广义化为迭代器,让STL能够为各种不同的容器类(包括那些简单指针无法处理的类)提供统一的接口。每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为iterator的typedef,其作用域为整个类。假设scores是一个vector。

阿常的博客 288

2024年数字IC秋招-格科微-数字电路设计工程师-笔试题

笔试题型:简答题(9个)笔试平台:牛客(电脑监控)笔试时间:2h。

qq_42135020的博客 1605

3.Linux基础开发⼯具【由浅入深-Linux】

在 Windows 环境中,我们习惯了双击 或 文件并一路点击“下一步”来安装软件。但在 Linux 的世界里,软件的分发和安装理念有着本质的不同。Linux 强调权限控制、模块化和依赖管理。为了帮您构建完整的 Linux 系统管理知识体系,我们可以将 Linux 下安装软件的方式归纳为五大主流阵营。这是 Linux 下最正统、也是日常使用频率最高的方式。它又细分为“在线仓库安装”和“本地包安装”两种场景。1. 在线仓库安装(如同手机自带的 App Store) 操作系统维护着一个庞大的软件云端仓库。通

插花弄玉的博客 770

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

16进制打印输出

python 以16进制打印输出 打印整数16进制 num=10 print(’%#x’%num) 打印字符串中的16进制 arr=‘12342535’ for i in arr: print(’%#x’%ord(i))

dong223的博客 3909

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C语言用十六进制的方式打印字符串(密文字符串打印查看)

密码算法处理后的数据D,如果使用普通的printf函数打印D,不能正确显示数据;其原因有1.ASCII编码的字符分为可显示字符和非可显示字符,2. 遇到00后会默认结束,等。所以要查看密文数据D,应该用十六进制的方式打印查看;其函数为PrintHex,具体如下。

super_SB的博客 1222

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

从未见过把内存玩的如此明白的文章(推荐大家都来看看)

最近由于工作原因需要调研一些内存监测方面的开源库,偶然间了解到了一个项目,叫iqiyi/xHook。 以前只用过malloc的hook,看完这个库作者写的文档后,我才发现,原来所有的动态链接库符号都可以hook(其实以前做过类似的,但是没有作者玩的这么骚)。 不想听我废话的朋友可以直接滑到最后,点击阅读原文看这个开源库的ReadMe。 下面是我的啰嗦环节。。。 这里主要介绍下我为什么推荐这个库?(不是广告,没收费,也不认识作者) 如果看完这个库的ReadMe,我相信大家会对

qq_29426201的博客 1187

C语言十六进制输出64位,防止被截断!!!!

uint64_t num = 9223354444668731392; printf("%lu\n", num); //十进制输出 printf(“0x%“PRIx64”\n”, num); //十六进制输出 printf(“0x%016lx\n”, num); //十六进制输出 ...

weixin_43274923的博客 6828

android基于plt/got的hook原理

目录 概述 简单示例 ELF文件格式初探 装载、动态链接与重定位 PLT与GOT 如何定位基址? 如何修改呢? 解析基址和偏移 思考和小结概述 我们日常开发中编写的C/C++代码经过NDK进行编译和链接之后,生成的动态链接库或可执行文件都是ELF格式的,它也是Linux的主要可执行文件格式。我们今天就要借助一个示例来理解一下android平台下native层hook的操作和原理,不过在这之前,我们...

Android系统攻城狮 2311

如何设置16进制条码并跳号打印

在制作条码标签时,像编号、序号或者内部码都会使用到流水号,很多用户在制作流水号时,咨询我们如何设置16进制的流水号并且要求跳号打印。在编辑数据处将数据起始设置为1,计数器步长设置为3,数据位数设置为3,数据总量设置为100,这些数值可以根据需求自行设置,然后勾选“以十六进制显示计数器”。点击【打印预览】,选择纸张并设置排版,从预览效果中可以看到,数据是以间隔3个(1、4、7、、)数据的方式展示。以上就是制作16进制流水号条形码并跳号打印的操作方法,还可以根据需要给条形码数据添加前缀或者后缀。

sqxskj的博客 761

【C/C++】C语言打印十六进制数据

2、使用PRIx64 和 PRIu64 宏(需要头文件 inttypes.h,支持跨平台)1、使用 "%llu"格式说明符。

Michael 2076

Linux进程间通信——使用共享内存

一、什么是共享内存 二、共享内存的创建 三、共享内存的读写 四、共享内存的优缺点

小张的专栏 750

C/C++编程:printf十六进制输出64位

#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <inttypes.h> int main() { uint64_t num = 9223354444668731392; printf("%lu\n", num); //十进制输出 printf("0x%"PRIx64"\n", num); //十

OceanStar的博客 1万+

项目开发中常用的十六进制方式打印实现

在项目开发中,比如网络开发,多媒体播放开发等,常常用到将接受数据和发送数据或者需要解析的数据,用打印方式呈现。方便自己定位问题。 在这个时候,printf难免没有满足我们的需要了。因为printf("bufdata =%s\n",bufdata),是用字符串方式输出,当碰到字符串中存在'\0'的时候,就会停止输出,造成打印不全,甚至打印死机(当字符串中没有'\0'结束符的时候,就会出现非法数据访

MangoDec的专栏 1316

C语言中如何用 printf 格式化打印16进制

【代码】C语言中如何用 printf 格式化打印16进制。

stephenbruce的博客 9514

C打印内存16进制

下面是一段C代码打印16进制。

weixin_43360707的博客 2437
上一篇: 嵌入式开发中的volatile陷阱(资深工程师亲授3大使用原则)
下一篇: 【C语言底层优化秘籍】:register关键字的生死真相与替代方案
ProceGlow
博客等级 码龄1年 139粉丝 2005原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值