首页 > 其他分享 >C语言之长整型有符号数与短整型有符号数转换

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

时间:2024-10-30 08:52:11浏览次数:3  
标签:取模 short 符号 int C语言 1234565789 整型 hd 范围

        最近考证的新星,问了一个问题: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、总结

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

标签:取模,short,符号,int,C语言,1234565789,整型,hd,范围
From: https://blog.csdn.net/qq_40939768/article/details/143320545

相关文章

  • 初学c语言(第一天)
     其实我也不太算是初学,但是也算是初学,这样说有点矛盾哈,让我来解释一下: 首先我是一个今年刚刚毕业的大学生,大学学的专业是电子信息工程,这个专业涉及过c语言,但是我大学期间只顾的潇洒了,没怎么认真学习,只有当大四下学期的时候我们离校需要出去找工作实习时,我才发现我什么都不......
  • 实验3 C语言函数应用编程
    #include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",score,gr......
  • 实验3_C语言函数应用编程
    任务一:#include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",......
  • C语言中实现一个包含开卡、查询内容、存钱、取钱、转账和修改密码的银行服务系统
       大家好,我是带我去滑雪,每天教你一个小技巧!   本次在C语言中实现一个包含开卡、查询内容、存钱、取钱、转账和修改密码的银行服务系统,下面开始代码实战。目录一、功能模块设计(1)开卡功能(2)查询内容(3)存钱功能(4)取钱功能(5)转账功能(6)修改密码功能二、数据结构......
  • 实验3 C语言函数应用编程
    1.实验任务1#include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",score,grad......
  • Linux更改符号链接
    目录1.删除旧链接2.创建新的符号链接例如我的电脑上有两个版本的cuda,11.8和12.41.删除旧链接rmcuda2.创建新的符号链接ln-s/usr/local/cuda-11.8//usr/local/cuda......
  • C语言 【句子倒叙】
        在学期C语言前期,经常会遇到一个经典的题目:倒序字符串。这个题目利用指针可以很简单地得到解决。句子倒叙需要用到这个思想,在正式句子倒叙之前我们先来倒叙字符串。#include<stdio.h>voidreverse(char*arr,char*right){ char*left=arr; while(left<......
  • c语言-数组队列-学习笔记
    数组队列#include<stdio.h>#include<stdlib.h>/*数组顺序队列*/typedefstructSqQueue{ intdata[10]; intfront; intrear;}SqQueue;voidInitQueue(SqQueue*Q){ Q->front=Q->rear=0;}voidEnQueue(SqQueue*Q,inta){ Q->data[Q->rear......
  • 在C语言中进行网络编程时,有哪些辅助工具可用
    标题:在C语言中进行网络编程时,有哪些辅助工具可用?在C语言中进行网络编程时,可用的辅助工具包括套接字库(如Winsock、BSDSockets)、协议库(如OpenSSL)、网络调试工具(如Wireshark)、以及集成开发环境(如Eclipse、VisualStudio)。这些工具为开发者提供了强大的支持,使得在C语言中进行网络编......
  • C语言:程序代码与文件的羁绊
    目录为什么使用文件文件认识程序文件数据文件文件名⼆进制文件和文本文件文件的打开和关闭流标准流文件指针文件操作符详解文件的操作:参数解释:文件操作符示例文件的打开与关闭读取文件字符串读取数据块写入数据块重定位文件指针获取指针位置文件指针移到开始处清除文......