printf和scanf处理long long int型数据

博客主要围绕printf和scanf对long long int型数据的处理展开,虽未给出具体内容,但可知聚焦于这两个函数在处理该数据类型时的相关操作。
linux下为:
1 long long a = 60122;
2 printf("%lld %lld %lld", a,a,a);
windows下为:
1 printf("%I64d %I64d %I64d", a,a,a);
long 和 int 都是4字节
long long 是8字节
<think>我们正在讨论C语言中的整数类,特别是`long long``int`。根据引用[1][2][3][4][5],我们可以总结如下: 1. **`int`类**: - 是C语言中的基本整数类,通常用于存储普通整数。 - 在大多数现代系统上(32位或64位),`int`通常占用**4字节(32位)**。 - 表示范围(有符号时):$-2^{31}$ 到 $2^{31}-1$,即 $-2,147,483,648$ 到 $2,147,483,647$。 - 无符号`unsigned int`范围:$0$ 到 $4,294,967,295$(即$2^{32}-1$)[^4]。 2. **`long long`类**: - 是C99标准引入的扩展整数类,用于存储非常大的整数。 - 通常占用**8字节(64位)**。 - 表示范围(有符号时):$-2^{63}$ 到 $2^{63}-1$,即 $-9,223,372,036,854,775,808$ 到 $9,223,372,036,854,775,807$。 - 无符号`unsigned long long`范围:$0$ 到 $18,446,744,073,709,551,615$(即$2^{64}-1$)[^1]。 3. **关键区别**: | 特性 | `int` | `long long` | |---------------|---------------------------|------------------------------| | **字节数** | 通常4字节(32位) | 通常8字节(64位) | | **最小值** | $-2^{31}$ | $-2^{63}$ | | **最大值** | $2^{31}-1$ | $2^{63}-1$ | | **无符号范围**| $0$ 到 $2^{32}-1$ | $0$ 到 $2^{64}-1$ | | **适用场景** | 常规整数计算(如计数器) | 大整数计算(如天文数字) | 4. **注意事项**: - **平台依赖性**:`int``long`的大小可能因平台或编译器而异(例如,在16位系统中`int`可能是2字节)[^2][^4],但`long long`在C99及以上标准中固定为至少64位。 - **输入输出**: - `int` 使用 `%d` 格式化符号。 - `long long` 使用 `%lld`(有符号)或 `%llu`(无符号)[^5]。 - **常量表示**:`long long`常量需加`LL`后缀,例如:`123456789012345LL`。 5. **示例代码**: ```c #include <stdio.h> int main() { int a = 2147483647; // int最大值 long long b = 9223372036854775807LL; // long long最大值 printf("int max: %d\n", a); printf("long long max: %lld\n", b); return 0; } ``` ### 总结 - 当需要存储超过20亿($2^{31} \approx 2.1 \times 10^9$)的整数时,应使用`long long`。 - 在资源受限环境中(如嵌入式系统),若数值范围较小,优先使用`int`以节省内存。 §§相关问题§§ 1. C语言中如何选择`short`、`int`、`long``long long`类? 2. 为什么不同平台上`int`的大小可能不同?如何编写可移植的整数类代码? 3. 如何检测当前编译器中各整数类的大小(例如使用`sizeof`运算符)? </think> 在C语言中,`int``long long`都是用于存储整数的基本数据,但它们在存储范围、内存占用使用场景上有显著区别: ### 1. **`int`类** - **定义**:标准整数类,用于存储常规整数 - **内存占用**: - 通常 **4字节(32位)**(在32/64位系统中常见) - C标准仅要求至少 **2字节**(16位)[^2] - **取值范围**: - 有符号(默认):$-2^{31}$ 到 $2^{31}-1$ ($-2,147,483,648$ 到 $2,147,483,647$) - 无符号(`unsigned int`):$0$ 到 $2^{32}-1$ ($0$ 到 $4,294,967,295$) - **示例**: ```c int counter = 100; // 常规整数 unsigned int flags = 0xFFFF; // 无符号整数 ``` ### 2. **`long long`类** - **定义**:C99标准引入的扩展整数类,用于存储超大整数 - **内存占用**: - 固定 **8字节(64位)**(C标准要求至少64位)[^1] - **取值范围**: - 有符号:$-2^{63}$ 到 $2^{63}-1$ ($-9,223,372,036,854,775,808$ 到 $9,223,372,036,854,775,807$) - 无符号(`unsigned long long`):$0$ 到 $2^{64}-1$ ($0$ 到 $18,446,744,073,709,551,615$)[^1] - **示例**: ```c long long population = 7800000000LL; // 全球人口数 long long file_size = 1024LL * 1024 * 1024 * 10; // 10GB文件大小 ``` ### 3. **关键区别总结** | 特性 | `int` | `long long` | |--------------|------------------------|---------------------------| | **字节数** | 通常4字节(32位) | 固定8字节(64位) | | **最小值** | $-2^{31}$ ($\approx -2.1 \times 10^9$) | $-2^{63}$ ($\approx -9.2 \times 10^{18}$) | | **最大值** | $2^{31}-1$ ($\approx 2.1 \times 10^9$) | $2^{63}-1$ ($\approx 9.2 \times 10^{18}$) | | **输入/输出**| `scanf("%d", &var)` | `scanf("%lld", &var)` | | | `printf("%d", var)` | `printf("%lld", var)` | | **后缀** | 无 | 常量需加 `LL`(如 `123LL`)| | **典场景** | 循环计数器、常规计算 | 天文数字、大文件处理、加密算法 | ### 4. **使用注意事项** 1. **跨平台兼容性**: - `int`的大小可能随系统变化(如16位系统中为2字节) - `long long`在所有支持C99+的系统中均为8字节 2. **类转换风险**: ```c long long big = 5000000000LL; int small = big; // 可能溢出(值超过21亿) ``` 3. **输入输出格式**: - `long long` 必须使用 `%lld`(有符号)或 `%llu`(无符号)[^5] - 错误示例: ```c long long n = 10000000000; printf("%d", n); // 错误!会导致截断或崩溃 ``` ### 5. **何时选择** - 优先用 `int`:处理普通整数($|n| < 2.1 \times 10^9$) - 必须用 `long long`: - 处理超过20亿的数字(如金融金额、科学计算) - 需要确保64位存储时(如跨平台开发) --- ### 代码示例 ```c #include <stdio.h> int main() { int max_int = 2147483647; // int最大值 long long max_ll = 9223372036854775807LL; // long long最大值 printf("int 最大值: %d\n", max_int); printf("long long 最大值: %lld\n", max_ll); // 溢出演示 printf("\n溢出示例:\n"); printf("int 最大值+1: %d\n", max_int + 1); // 溢出为负数 printf("long long 安全计算: %lld\n", max_ll + 1); // 正常递增 return 0; } ``` 输出: ``` int 最大值: 2147483647 long long 最大值: 9223372036854775807 溢出示例: int 最大值+1: -2147483648 long long 安全计算: 9223372036854775808 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值