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

news/2024/10/30 19:08:25/

        最近考证的新星,问了一个问题: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到32767return (short)((x % (SHRT_MAX + 1)) + SHRT_MIN);
}

6、总结

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


http://www.ppmy.cn/news/1543167.html

相关文章

Hadoop生态圈框架部署(一)- Linux操作系统安装及配置

文章目录 前言一、下载CentOS镜像1. 下载 二、创建虚拟机hadoop1三、CentOS安装、克隆与配置1. 安装CentOS2. 根据虚拟机hadoop1克隆出虚拟机hadoop23. 根据虚拟机hadoop1克隆出虚拟机hadoop34. 配置虚拟网络及虚拟网卡4.1 配置虚拟网络4.1 配置虚拟网卡 5. 安装 SSH 远程连接工…

goalng框架Gin解析

本文通过案例的形式,说明gin框架的基本用法,主要列举后端的案例,前端和相对简单的知识点未在此分析; 过完案例后可以有个基本的印象:就是封装和简便 package mainimport ("fmt""github.com/gin-gonic/…

第十四题刮开有奖

这道题还是将我们下载好的附件先查壳 发现无壳且为32位 所以我们用32位的IDA打开 打开后ShftF12发现一串可疑的字符串 我们跟进看看 发现了这个函数 看这里有string数组 首先给了一串七v7 v8v9的数据 下面还有一个函数 我们再跟进一下 发现这大概是前面v7那堆数据的加密方式 我…

30. 串联所有单词的子串 C#实现

30. 串联所有单词的子串 困难 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words ["ab","cd","ef"]…

前端js中如何保护密钥?

在前端js编程中,如果涉及到加密通信、加密算法,经常会用到密钥。 但密钥,很容易暴露。暴露原因:js代码透明,在浏览器中可以查看源码,从中找到密钥。 例如,下面的代码中,变量key是密…

Soanrquber集成Gitlab 之 gitlab用户配置和身份验证

集成Gitlab : gitlab用户配置和身份验证 说明: 使得Sonarquber的用户登录与Gitlab的用户登录/认证模块同步 什么是 SonarQube? SonarQube 是一个开源的代码质量管理平台,用于持续检查和分析代码的质量和安全性。它提供了多种功…

漏洞挖掘 | 基于mssql数据库的sql注入

前记 今天挖edu随意点开个站,发现存在mssql数据库的sql注入,在此分享下整个挖掘过程 目录 0x1 判断网站数据库类型 0x2 了解mssql数据库的主要三大系统表 0x3 了解mssql的主要函数 0x4 判断注入点及其注入类型 0x5 联合查询之判断列数 0x6 联合查询之…

C++ 在项目中使用vim

一:概述 除了掌握 Vim 的基本操作,利用 Vim 阅读项目源码的方法同样重要,这对实际项目开发大有裨益。虽然现在有许多人选择使用 VSCode,但在某些环境中,可能无法安装 VSCode 或联网下载插件,这时使用 Vim 就…