C语言printf使用错误导致程序崩溃
在 C 语言中,printf
的格式化字符串中,%ld
表示以 十进制有符号长整型(signed long int) 格式打印变量。具体解析如下:
1. %ld
的含义
-
%
:格式化说明符的起始符号。 -
l
:长度修饰符(long
类型)。 -
d
:表示输出的是 有符号十进制整数。
因此,%ld
用于打印 signed long int
类型的变量。
2. 适用场景
-
当变量是
long
或long int
类型时(通常是 32 位或 64 位,具体取决于平台)。 -
例如:
c
复制
下载
long num = -123456789L; printf("Number: %ld\n", num); // 输出:Number: -123456789
3. 与类似格式符的区别
格式符 | 含义 | 适用类型 |
---|---|---|
%d | 有符号十进制整型 | int |
%ld | 有符号十进制长整型 | long 或 long int |
%lld | 有符号十进制长长整型 | long long |
%u | 无符号十进制整型 | unsigned int |
%lu | 无符号十进制长整型 | unsigned long |
4. 在 ESP32 中的注意事项
-
ESP32 的
long
大小:-
在 32 位架构(如 ESP32)中,
long
通常是 32 位,与int
相同。 -
但使用
%ld
可以明确表明变量是long
类型,增强代码可读性。
-
-
打印
uint32_t
时的替代方案:
如果需要打印无符号长整型(如uint32_t
),建议用%lu
或跨平台的PRIu32
:c
复制
下载
#include <inttypes.h> uint32_t value = 4294967295; printf("Value: %lu\n", (unsigned long)value); // 方法 1 printf("Value: %" PRIu32 "\n", value); // 方法 2(推荐)
5. 常见错误
-
类型不匹配:
如果用%ld
打印int
类型,可能不会报错但会引发未定义行为(UB)。c
复制
下载
int num = 42; printf("%ld\n", num); // 错误!应用 %d
-
符号混淆:
%ld
用于有符号数,打印无符号数应用%lu
:unsigned long num = 123456; printf("%lu\n", num); // 正确 printf("%ld\n", num); // 可能输出错误值
6. 示例代码
#include <stdio.h>int main() {long a = -123456789L;unsigned long b = 4294967295UL;int c = 32767;printf("a (signed long): %ld\n", a); // 正确printf("b (unsigned long): %lu\n", b); // 正确printf("c (int): %d\n", c); // 正确// printf("c (wrong): %ld\n", c); // 错误!return 0; }
总结
-
%ld
:专用于signed long int
类型。 -
ESP32 开发:注意
long
是 32 位,打印uint32_t
时优先用PRIu32
。 -
避免错误:严格匹配格式化字符串与变量类型。