%lld 和%I64d 区别 输出64位16进制 float与double输入与输出的区别

本文详细解析了C语言中64位整型的格式化输出方法,包括%I64x和%lld的区别及使用场景,以及它们在不同编译器和平台上的支持情况。同时介绍了十六进制输出格式,并对比了%d、%ld和%lld在不同类型数据输出上的差异。

(一)

%I64x和%lld两种都是C语言中格式化输出64位整型的正确做法。

区别在于编译器不同。

gcc(mingw32),g++(mingw32)只支持%I64d的输出方式。
gcc(linux i386),g++(linux i386)只支持%lld的输出方式。

另外,mac上的gcc/g++不支持%I64d的方式

(二)

输出64位数的十六进制可以用 %llx,也可以用%I64x,I64表示64位int值(I32表示32位int值,i必须大写), x表示十六进制形式显示,小写的x表示16进制的字母以小写的形式输出(a,b,c,d,e,f),大写的X表示十六进制的字母以大写的形式输出(A,B,C,D,E,F)

(三)

在printf中%d用于int或者比int小的整数类型。比int小的类型被转型成int。

%ld用于long类型,%lld用于long long类型。

%x标识的数会被当成int进行读取,所以long long类型的数如果超过int的范围会被截断,得不到正确的结果。而且因为它多占了4个字节,还会影响后面的其它标识符的输出。

输入 float用%f,double用%lf,输出都是用%f


原文:https://blog.youkuaiyun.com/fz_ywj/article/details/8107582

原文:https://blog.youkuaiyun.com/ShellDawn/article/details/74177892

<think>我们被要求回答关于C语言printf函数的三个问题: 1. %p格式符的作用 2. long long类型的格式符 3. double类型的格式符 根据引用[4]:格式化规定符中,%p用于输出指针的值。 另外,引用[4]还提到: - 对于长整型(long),使用%ld - 对于双精度浮点数(double),使用%lf(但在printf中,%f也可以用于double,因为float参数会自动提升为double) 但是注意,对于long long类型(C99标准引入),格式符是%lld(有符号)%llu(无符号)。 另外,引用[1]提到printf是C语言标准库函数,用于将格式化字符串输出到终端。 因此,我们可以这样回答: 1. %p:用于输出指针(即内存地址),通常以十六进制形式输出。例如: ```c int x = 10; printf("Address of x: %p\n", (void*)&x); ``` 2. long long类型:使用%lld(有符号)或%llu(无符号)。例如: ```c long long big = 123456789012345LL; printf("big = %lld\n", big); ``` 3. double类型:在printf中,%f%lf都可以用于输出double,因为C语言规定,对于可变参数的函数(如printf),float类型的参数会被提升为double。所以,使用%f即可。但是,在scanf中,%f用于float,%lf用于double,这一点需要注意区分。例如: ```c double d = 3.1415926535; printf("d = %f\n", d); // 正确 printf("d = %lf\n", d); // 在printf中,%lf也是正确的,但通常用%f即可 ``` 注意:在C99标准中,printf支持%lf,但效果%f相同。不过,为了scanf的格式区分,建议在printf中使用%f,在scanf中使用%lf。 另外,引用[4]中关于浮点数的格式说明:可以使用%9.2f这样的格式来指定宽度小数数。 最后,我们还需要注意引用[3]中提到的scanf的格式,但这里我们主要关注printf。 总结: - %p: 指针(地址) - long long: %lld(有符号)、%llu(无符号) - double: %f 或 %lf(在printf中两者皆可,但%f更常用) 我们按照要求生成回答,并添加相关问题。</think>### C语言 `printf` 函数中 `%p`、`long long` `double` 格式符详解 #### 1. **`%p` 格式符:指针地址输出** `%p` 用于输出**指针的内存地址**(以十六进制表示),是调试内存分析的关键工具[^4]: ```c int num = 42; printf("变量地址: %p", (void*)&num); // 输出:变量地址: 0x7ffd5fb1238c ``` - **强制转换**:需用 `(void*)` 确保类型安全 - **应用场景**:调试内存分配、指针校验、数据结构分析 - **输出格式**:通常为 `0x` 开头的十六进制值(如 `0x7ffc89a2b4`) > **注意**:`%p` 输出的地址长度取决于系统架构(32系统8字符,64系统16字符)[^4]。 --- #### 2. **`long long` 类型的格式符** `long long`(8字节整型)需使用 **`%lld`(有符号)** 或 **`%llu`(无符号)**: ```c long long bigNum = 9223372036854775807LL; // 最大值 printf("有符号: %lld\n", bigNum); // 输出:9223372036854775807 printf("无符号: %llu\n", (unsigned long long)bigNum); ``` - **必须加 `l`**:`%ld` 仅适用于 `long`(4字节),`long long` 需双 `l`(`%lld`) - **平台兼容**:Windows/Linux 均支持此格式[^4] --- #### 3. **`double` 类型的格式符** `double`(双精度浮点数)使用 **`%f`** 或 **`%lf`**(两者等效): ```c double pi = 3.1415926535; printf("默认: %f\n", pi); // 输出:3.141593(默认6小数) printf("精确: %.10f\n", pi); // 输出:3.1415926535 printf("科学计数: %e\n", pi); // 输出:3.141593e+00 ``` - **精度控制**:`%.2f` 保留2小数,`%10.3f` 占10字符宽度含3小数 - **特殊值处理**: ```c double inf = 1.0/0.0; printf("无穷大: %f\n", inf); // 输出:inf(Linux)或 1.#INF00(Windows) ``` --- ### 关键对比表 | **数据类型** | **格式符** | **示例** | **输出示例** | |----------------|------------|------------------------|----------------------| | 指针地址 | `%p` | `printf("%p", &x);` | `0x7ffc89a2b4` | | `long long` | `%lld` | `printf("%lld", n);` | `922337203685477` | | `double` | `%f`/`%lf` | `printf("%.2f", pi);` | `3.14` | | `float` | `%f` | `printf("%f", f);` | `1.230000` | | `long double` | `%Lf` | `printf("%Lf", ld);` | `3.1415926535` | > **类型匹配警告**:格式符数据类型不匹配会导致**未定义行为**(如用 `%d` 输出 `double` 会输出乱码)[^4]。 --- ### 高级用法示例 ```c #include <stdio.h> int main() { // 指针地址输出 int x = 10; printf("x的地址: %p\n", (void*)&x); // long long 格式化 long long pop = 7800000000LL; printf("全球人口: %'lld\n", pop); // 输出:7,800,000,000(千分隔符) // double 科学计数法 double atom = 0.0000000001; printf("原子直径: %.2e米\n", atom); // 输出:1.00e-10米 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值