打印short、long、long long和unsigned类型数

/* print2.c ——printf()的更多属性 */

#include <stdio.h>

int main (void)

{
    unsigned int un = 3000000000;    /* int为32位 */

    short end = 200;                   /* 和short为16位的系统 */

    long big = 65537; long long verybig = 12345678642;

    printf ("un = %u and not %d\n",un,un);    /* 打印unsigned int 数字,可以使用%u符号 */

    printf ("end = %hd and %d\n",end,end);   /*%hd表示以十进制显示short整数,如果系统的int和long类型具有同样的长度,使用%d就可以打印long数值*/

    printf ("big = %d and not %hd\n",big,big);

    printf ("verybig = %lld and not %ld\n",verybig,verybig);  /* 打印long数值,可以使用%ld格式说明符 ,long long类型的系统使用%lld和%llu分别表示有符号类型和无符号类型*/

    return 0;

}

下面是在某系统上的执行结果:

un = 3000000000 and not -1294967296

end =200 and 200

big = 65537 and not 1

verybig =12345678908642 and not 1942899938

<think>我们正在讨论C语言中的两种无符号整类型:`unsignedshortint``unsignedlongint`。根据引用内容,我将从定义、大小、取值范围以及使用场景等方面进行详细介绍,并指出它们之间的区别。###1.`unsignedshortint`类型**定义**:`unsignedshortint`(通常简写为`unsignedshort`)是一种无符号短整类型,用于表示非负整。它在内存中占用的空间比标准整类型`int`小,适用于存储较小范围的整。**大小(占用字节)**:在大多现代系统中,`unsignedshortint`占用**2个字节(16位)**。这是由C语言标准所规定的,但在极少系统上可能有所不同。**取值范围**:由于是无符号类型,其取值范围为$0$到$2^{16}-1$,即:$$0\sim65535$$**使用场景**:-存储较小的非负整(如年龄、计器值)-内存受限的系统中节省空间-与硬件寄存器交互时(某些寄存器是16位)**打印格式**:在`printf`函中使用`%hu`格式说明符(`h`表示`short`,`u`表示无符号):```cunsignedshortnum=50000;printf("Value:%hu\n",num);//输出:Value:50000```###2.`unsignedlongint`类型**定义**:`unsignedlongint`(通常简写为`unsignedlong`)是一种无符号长整类型,用于表示较大范围的整。它可以存储比`unsignedint`更大的值。**大小(占用字节)**:-在32位系统中通常占用**4个字节(32位)**-在64位系统中通常占用**8个字节(64位)**这种差异是由不同系统的ABI(应用二进制接口)规范决定的。**取值范围**:-32位(4字节):$0\sim2^{32}-1$($0\sim4,294,967,295$)-64位(8字节):$0\sim2^{64}-1$($0\sim18,446,744,073,709,551,615$)**使用场景**:-需要存储大于65535的非负整(如文件大小、大计器)-位运算操作(例如需要超过16位的掩码)-跨平台编程中确保特定宽度(但需注意不同系统的长度差异)**打印格式**:在`printf`函中使用`%lu`格式说明符(`l`表示`long`):```cunsignedlongbigNum=4294967295UL;//后缀UL表示unsignedlongprintf("BigValue:%lu\n",bigNum);```###3.关键区别总结|**特性**|**unsignedshortint**|**unsignedlongint**||----------------|---------------------------------|-------------------------------------||**简写形式**|`unsignedshort`|`unsignedlong`||**典型大小**|2字节(16位)|4字节(32位)或8字节(64位)||**取值范围**|$0\sim65535$|$0\sim4.29\times10^9$(32位)或更大(64位)||**内存占用**|较小(节省内存)|较大(根据系统变化)||**适用场景**|小值、内存敏感场景|大值、跨平台兼容需求||**打印格式**|`%hu`|`%lu`|###4.使用注意事项1.**类型转换风险**:将`unsignedlong`赋值给`unsignedshort`可能导致**截断**(例如将500,000赋值给`unsignedshort`会变为$500000\mod65536=19072$)。2.**跨平台一致性**:`unsignedlong`的大小随系统变化,若需固定宽度,建议使用`<stdint.h>`中的:-`uint16_t`(等价于`unsignedshort`)-`uint32_t`(32位无符号整)-`uint64_t`(64位无符号整)3.**打印安全性**:始终匹配格式说明符:-用`%hu`打印`unsignedshort`-用`%lu`打印`unsignedlong`错误匹配(如用`%d`打印`unsignedlong`)会导致未定义行为。```mermaidgraphLRA[选择整类型]-->B{需要存储的值范围}B-->|0~65535|C[unsignedshort]B-->|大于65535|D[unsignedlong]D-->E{系统位}E-->|32位|F[最大4.29e9]E-->|64位|G[最大1.84e19]```###5.示例对比```c#include<stdio.h>intmain(){unsignedshortsmall=65535;//最大值unsignedlonglarge_32=4294967295UL;//32位系统最大值unsignedlonglarge_64=18446744073709551615ULL;//64位系统最大值printf("small(max):%hu\n",small);//正确输出printf("large(32-bitmax):%lu\n",large_32);//正确输出//错误示例:类型不匹配//printf("Error:%d\n",large_32);//可能输出错误值return0;}```§§相关问题§§1.如何在C++中精确控制整类型的位宽?[^1]2.无符号整与有符号整混算时会发生什么?[^2]3.为什么不同系统上`long`类型的长度不一致?[^3][^1]:ANSIC标准规定`short`至少16位,`long`至少32位[^2]:在溢出时无符号类型采用模运算,有符号类型为未定义行为[^3]:C标准允许实现根据硬件特性调整基础类型的大小</think> ### C语言中 `unsigned short int` 与 `unsigned long int` 类型详解 #### 1. **基本定义** - **`unsigned short int`** 无符号短整型(通常简写为 `unsigned short`),用于存储较小的非负整,具有固定位宽: - **位宽**:通常为 **16 位**(2 字节) - **取值范围**:$0$ 到 $2^{16}-1$(即 $0 \sim 65,535$)[^1][^2] - **`unsigned long int`** 无符号长整型(通常简写为 `unsigned long`),用于存储较大的非负整,位宽随系统变化: - **32 位系统**:通常为 **32 位**(4 字节) 范围:$0$ 到 $2^{32}-1$($0 \sim 4,294,967,295$) - **64 位系统**:通常为 **64 位**(8 字节) 范围:$0$ 到 $2^{64}-1$($0 \sim 18,446,744,073,709,551,615$)[^1][^2] #### 2. **核心区别** | **特性** | **`unsigned short`** | **`unsigned long`** | |------------------|------------------------------------|-------------------------------------| | **占用内存** | 固定 2 字节 | 可变:32位系统4字节,64位系统8字节 | | **取值范围** | $0 \sim 65,535$ | 最大可达 $1.84 \times 10^{19}$ | | **平台依赖性** | 基本固定 | 高度依赖操作系统架构 | | **典型应用场景** | 计器、小范围ID、硬件寄存器操作 | 大文件尺寸、内存地址、大据计算 | #### 3. **使用示例** ```c #include <stdio.h> int main() { unsigned short smallNum = 65535; // 最大值 unsigned long bigNum = 4294967295UL; // 32位系统最大值(后缀 UL) printf("smallNum (%%hu): %hu\n", smallNum); // 输出: 65535 printf("bigNum (%%lu): %lu\n", bigNum); // 32位系统输出: 4294967295 return 0; } ``` **格式化说明符**: - `unsigned short`:`%hu`(十进制)、`%hx`(十六进制)[^2] - `unsigned long`:`%lu`(十进制)、`%lx`(十六进制)[^3] #### 4. **关键注意事项** 1. **隐式转换风险** ```c unsigned long a = 50000; unsigned short b = a; // 若 a > 65535,b 会截断 ``` 2. **平台移植性问题** ```c // 跨平台代码应避免假设 long 的尺寸 #if __LP64__ // 64位系统检测 unsigned long fileSize = 8UL * 1024 * 1024 * 1024; #else // 32位系统需改用 long long unsigned long long fileSize = 8ULL * 1024 * 1024 * 1024; #endif ``` 3. **计算效率差异** - `unsigned short`:运算速度快,适合嵌入式系统 - `unsigned long`:64位系统上高效处理大,32位系统可能需多次运算[^2] #### 5. **选择建议** $$\begin{array}{c|c} \text{场景} & \text{推荐类型} \\ \hline \text{内存敏感(如MCU)} & \text{unsigned short} \\ \text{文件/内存地址处理} & \text{unsigned long} \\ \text{跨平台大据} & \text{uint64\_t (stdint.h)} \\ \end{array}$$ ```mermaid graph TD A[需要存储的值] --> B{是否大于 65,535?} B -->|否| C[使用 unsigned short] B -->|是| D{目标平台是?} D -->|32位系统| E[使用 unsigned long long] D -->|64位系统| F[使用 unsigned long] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值