C语言之长整型有符号数与短整型有符号数转换

最近考证的新星,问了一个问题:int a = 1234565789;为什么在输出%hd时的值为-1379?其实这个很简单,只不过对于可能初入"编程坑"以及经验不是很丰富的朋友来说,感觉知道这么个道理,但就是解释不上来,无法做出实际的推论。作者想说的是,这个知识点亦涉及多方面,比较广泛,所以就以咱们未来的新星所提的问题进行分析。

目录

1、int与%hd(short)的数据范围是多大?

2、%hd(short)转int

3、int转%hd(short)

4、何谓取模?

5、运算实例

6、总结

1、int与%hd(short)的数据范围是多大?

解:想要回答int a = 1234565789;为什么在输出%hd时的值为-1379,就需要知道这两种数据类型的表示范围。

在大多数现代编程语言和系统中

int 通常占用4个字节(32位)

即:[-2^31,2^31-1] -> [-2147483648,2147483647];

%hd通常占2字节(16位)

即:[-2^16,2^16-1] --> [-32768,32767];

2、%hd(short)转int

由上述可知,int的表示范围比short的大,所以可直接赋值,不需要进行转换。

3、int转%hd(short)

short的表示范围比int的小,所以有两种情况需要考虑:

第一种:int类型的变量所表示的数据范围在short之间,也就是[-32768,32767],那么便可直接赋值,通常是安全的操作;

第二种:int类型的变量所表示的数据范围超出short所能表示的范围,如果此时直接赋值,那赋予short的值将是int类型变量的值对short的数据范围取模后的结果。针对此类操作,作为优秀的软件工程师,理应了解其程序运算轨迹,因为程序本身的没错的,错的只是用错它的人。

4、何谓取模?

解:在数学和计算机科学中,取模(Modulo)是一种二元运算,表示为 a % b,其中 a 是被除数,b 是除数。取模运算的结果是 a 除以 b 后的余数。

5、运算实例

为节省大家时间,将以实际举例说明 int 转 short 时的第二种情况。以新星提出的问题为例:

复制代码
int a = 1234565789 ;
printf("%hd",a);  //输出结果:-1379

针对此例,满足第二种情况,故需要对1234565789对short数据范围进行取模运算。即:

1234565789 % (32767 + 1) - 32768 = -1379

下面是基于C语言是转换代码,有疑问的朋友可以配合下面代码实操测试一下,看它千百遍,不如动手敲一遍。

复制代码
short modShort(int x) {
    // short的范围是SHRT_MIN到SHRT_MAX,即-32768到32767
    return (short)((x % (SHRT_MAX + 1)) + SHRT_MIN);
}

6、总结

希望通过上述的内容讲解能够对大家有所帮助,特别是刚入门的新星,作者也是从你们现在那里一步一步走出来的,深知此类困惑将成为众多学子的劝退令一般。所以也是在工作之余写一些文章能够帮助大家。

相关推荐
颜酱2 小时前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
zone77397 小时前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试
CoovallyAIHub10 小时前
OpenClaw 近 2000 个 Skills,为什么没有一个好用的视觉检测工具?
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
CVPR 2026 | 用一句话告诉 AI 分割什么——MedCLIPSeg 让医学图像分割不再需要海量标注
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
Claude Code 突然变成了 66 个专家?这个 5.8k Star 的开源项目,让我重新理解了什么叫"会用 AI"
深度学习·算法·计算机视觉
兆子龙10 小时前
前端哨兵模式(Sentinel Pattern):优雅实现无限滚动加载
前端·javascript·算法
CoovallyAIHub14 小时前
9个视觉语言模型工厂实测:Qwen 87.9%碾压全场,你的显卡能跑哪个?
算法
SparkX开源AI知识库14 小时前
手摸手带你安装OpenClaw并对接飞书
算法·架构
一语071614 小时前
3分钟搞懂深度学习AI:实操篇:卷积层
人工智能·算法