C语言中的整数

整数是编程中常用的一种数据,C语言通常使用int来定义整数(int 是 integer 的简写)。

现代操作系统中,int 一般占用 4 个字节(Byte)的内存,共计 32 位(Bit)。如果不考虑正负数,当所有的位都为 1 时它的值最大,为 232-1 = 4,294,967,295 ≈ 43亿,这是一个很大的数,实际开发中很少用到,而诸如 1、99、12098 等较小的数使用频率反而较高。

使用 4 个字节保存较小的整数绰绰有余,会空闲出两三个字节来,这些字节就白白浪费掉了,不能再被其他数据使用。

我们要让整数占用更多的内存,用来表示更大的值,比如占用 6 个字节或者 8 个字节。

让整数占用更少的内存可以在 int 前边加 short,让整数占用更多的内存可以在 int 前边加 long。

示例

short int a = 10;
short int b, c = 99;
long int m = 12123;
long int n, p = 562131;

这样 a、b、c 只占用 2 个字节的内存,而 m、n、p 可能会占用 8 个字节的内存。

我们也可以将 int 省略,只写 short 和 long,如下所示:

short a = 10;
short b, c = 99;
long m = 102023;
long n, p = 562131;

这样的写法更加简洁高效。

int 是基本的整数类型,short 和 long 是在 int 的基础上进行的扩展,short 可以节省内存,long 可以容纳更大的值。

short、int、long 是C语言中常见的整数类型,其中 int 称为整型,short 称为短整型,long 称为长整型。

整型的长度

我们在描述short、int、long 类型的长度时,只对 short 使用肯定的说法,而对 int、long 使用了“一般”或者“可能”等不确定的说法。这种描述的言外之意是,只有 short 的长度是确定的,是两个字节,而 int 和 long 的长度无法确定,在不同的环境下有不同的表现。
一种数据类型占用的字节数,称为该数据类型的长度。例如,short 占用 2 个字节的内存,那么它的长度就是 2。

C语言并没有严格规定 short、int、long 的长度,只做了宽泛的限制:

	short 至少占用 2 个字节。int 建议为一个机器字长。32 位环境下机器字长为 4 字节,64 位环境下机器字长为 8 字节。short 的长度不能大于 int,long 的长度不能小于 int。

它们的长度(所占字节数)关系为:

2shortintlong

short 并不一定真的”短“,long 也并不一定真的”长“,它们有可能和 int 占用相同的字节数。

在 16 位环境下,short 的长度为 2 个字节,int 也为 2 个字节,long 为 4 个字节。

对于 32 位的 Windows、Linux 和 Mac OS,short 的长度为 2 个字节,int 为 4 个字节,long 也为 4 个字节。

在 64 位环境下,不同的操作系统会有不同的结果,如下图所示:
在这里插入图片描述

在PC系统为 Win XP、Win 7、Win 8、Win 10、Mac OS、Linux,中,short 和 int 的长度都是固定的,分别为 2 和 4,大家可以放心使用,只有 long 的长度在 Win64 和类 Unix 系统下会有所不同,使用时要注意移植性。

sizeof 操作符

获取某个数据类型的长度可以使用 sizeof 操作符。

示例

#include <stdio.h>
int main()
{short a = 10;int b = 100;int short_length = sizeof a;int int_length = sizeof(b);int long_length = sizeof(long);int char_length = sizeof(char);printf("short=%d, int=%d, long=%d, char=%d\n", short_length, int_length, long_length, char_length);return 0;
}

在 32 位环境以及 Win64 环境下的运行结果为:

short=2, int=4, long=4, char=1

在 64 位 Linux 和 Mac OS 下的运行结果为:

short=2, int=4, long=8, char=1

sizeof 用来获取某个数据类型或变量所占用的字节数,如果后面跟的是变量名称,那么可以省略( ),如果跟的是数据类型,就必须带上( )。

注意: sizeof 是C语言中的操作符,不是函数,所以可以不带( )。

使用不同的格式控制符可以输出不同类型的整数

	%hd用来输出 short int 类型,hd 是 short decimal 的简写;%d用来输出 int 类型,d 是 decimal 的简写;%ld用来输出 long int 类型,ld 是 long decimal 的简写。

不同整型的输出:

#include <stdio.h>
int main()
{short a = 10;int b = 99;long c = 9437;printf("a=%hd, b=%d, c=%ld\n", a, b, c);return 0;
}

运行结果:

a=10, b=99, c=9437

注意:要将格式控制符和数据类型严格对应起来,养成良好的编程习惯。当然,如果你不严格对应,一般也不会导致错误。

使用%d输出所有的整数类型

#include <stdio.h>
int main()
{short a = 10;int b = 99;long c = 9437;printf("a=%d, b=%d, c=%d\n", a, b, c);return 0;
}

运行结果仍然是:

a=10, b=99, c=9437

当使用%d输出 short,或者使用%ld输出 short、int 时,不管值有多大,都不会发生错误,因为格式控制符足够容纳这些值。

当使用%hd输出 int、long,或者使用%d输出 long 时,如果要输出的值比较小(如上所示情况),一般也不会发生错误,如果要输出的值比较大,就很有可能发生错误,例如:

#include <stdio.h>
int main()
{int m = 306587;long n = 28166459852;printf("m=%hd, n=%hd\n", m, n);printf("n=%d\n", n);return 0;
}

在 64 位 Linux 和 Mac OS 下(long 的长度为 8)的运行结果为:

m=-21093, n=4556
n=-1898311220

输出结果错误,这是因为%hd容纳不下 m 和 n 的值,%d也容纳不下 n 的值。

我们在编写程序的时候要特别注意,当格式控制符和数据类型不匹配时,编译器会给出警告,提示程序可能会存在风险。

编译器的警告是分等级的,不同程度的风险被划分成了不同的警告等级,而使用%d输出 short 和 long 类型的风险较低,如果你的编译器设置只对较高风险的操作发出警告,那么此处你就看不到警告信息。

如果感觉不错的话请点赞!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没有bug队——加贝——Python 39,40

目录 39.题目&#xff1a;有一个已经排好序的数组。现输入一个数&#xff0c;要求按原来的规律将它插入数组中。 40.题目&#xff1a;将一个数组逆序输出。 39.题目&#xff1a;有一个已经排好序的数组。现输入一个数&#xff0c;要求按原来的规律将它插入数组中。 程序分析…

C语言中的二进制、八进制和十六进制的表示

二进制数、八进制数和十六进制数的表示 一个数字默认就是十进制的&#xff0c;表示一个十进制数字不需要任何特殊的格式。但是&#xff0c;表示一个二进制、八进制或者十六进制数字就不一样了&#xff0c;为了和十进制数字区分开来&#xff0c;必须采用某种特殊的写法&#xf…

没有bug队——加贝——Python 41,42

41.题目&#xff1a;模仿静态变量的用法。 python中是不支持静态变量的&#xff0c;所以可以通过以下的方法来实现静态变量的功能&#xff1a; 代码1&#xff1a; class CTest(object):#python静态变量实现方法i__initNonedef __new__(cls,value):if cls.i__init is None:cl…

C语言中的正负数及其输出

在数学中&#xff0c;数字有正负之分。在C语言中也是一样&#xff0c;short、int、long 都可以带上正负号&#xff0c;示例 //负数 short a1 -10; short a2 -0x2dc9; //十六进制 //正数 int b1 10; int b2 0174; //八进制 int b3 22910; //负数和正数相加 long c (-9)…

没有bug队——加贝——Python 43,44

目录 43.题目&#xff1a;模仿静态变量(static)另一案例。 44 - Python 两个矩阵相加 43.题目&#xff1a;模仿静态变量(static)另一案例。 程序分析&#xff1a;演示一个python作用域使用方法 #43 class Num:nNum 1def inc(self):self.nNum 1print (nNum %d % self.nN…

数学建模学习笔记(一)——层次分析模型

1.模型简介 层次分析模型主要应用于综合评价类问题&#xff0c;例如&#xff1a;怎样购买最划算、怎样养殖才能获得最大经济效益等等。 2.下面使用一道例题来说明这个问题 问题&#xff1a;你想要购置一台个人电脑&#xff0c;考虑价格、性能等因素&#xff0c;如何做出决策…

没有bug队——加贝——Python 45,46

目录 45.题目&#xff1a;统计 1 到 100 之和。 46.题目&#xff1a;求输入数字的平方&#xff0c;如果平方运算后小于 50 则退出。 实现1 实现2 Python While 循环语句 跳过循环 无限循环 循环使用 else 语句 45.题目&#xff1a;统计 1 到 100 之和。 #45 tmp 0 for…

没有bug队——加贝——Python 47,48

目录 47.题目&#xff1a;两个变量值互换。 实现1 实现2 48.题目&#xff1a;数字比较。 47.题目&#xff1a;两个变量值互换。 实现1 a 10 b 20 print(x ,a ,y ,b) a,b b,a print(x ,a ,y ,b) 输出&#xff1a; 实现2 #47 def exchange(a,b):a,b b,areturn (a,…

Latex笔记(一)—— 复杂表格的制作

引言 表格是论文写作中的重要一环&#xff0c;尤其是较为复杂的三线表的制作。 在网上寻找了很久发现没有比较综合的解释方法&#xff0c;因此将查阅的关于复杂三线表的制作的资料总结成了一篇笔记。 由于笔记是用Latex写作的&#xff0c;因此这里只放上Latex生成的pdf的截图&…

C语言转义字符的使用

字符集&#xff08;Character Set&#xff09;为每个字符分配了唯一的编号&#xff0c;我们不妨将它称为编码值。在C语言中&#xff0c;一个字符除了可以用它的实体&#xff08;也就是真正的字符&#xff09;表示&#xff0c;还可以用编码值表示。这种使用编码值来间接地表示字…

数学建模学习笔记(二)——Topsis优劣解距离法

&#xff08;续上篇文章&#xff09;层次分析法的局限 上一篇文章中&#xff0c;层次分析法有这样的局限 评价决策层不能太多&#xff1b;数据是已知的的话&#xff0c;便无法使用层次分析法进行精确的分析评价&#xff1b; 因此&#xff0c;为对这些情况做出更为精准的分析…

没有bug队——加贝——Python 49,50

49.题目&#xff1a;使用lambda来创建匿名函数。 lambda函数 紧跟的是定义的自变量&#xff0c;因变量等&#xff0c;其后是函数 MAXIMUM lambda x,y : (x > y) * x (x < y) * y MINIMUM lambda x,y : (x > y) * y (x < y) * xif __name__ __main__:a 10…

没有bug队——加贝——Python 51,52

目录 知识点&#xff1a; 51.题目&#xff1a;学习使用按位与 & 。 52.题目&#xff1a;学习使用按位或 | 。 知识点&#xff1a; 运算符描述实例&按位与运算符&#xff1a;参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a & b) 输出结果 12 …

数学建模学习笔记(三)——插值算法

插值算法简介 数据分析是在大数据时代下不可获取的一环&#xff0c;合理、全面地分析数据&#xff0c;能够使得决策者在决策时作出最为明智的决定。在数据分析过程中&#xff0c;常常可以使用插值算法来根据已知的数据估算出未知的数据&#xff0c;从而模拟产生一些新的值来满…

没有bug队——加贝——Python 53,54

目录 53.题目&#xff1a;学习使用按位异或 ^ 。 54.题目&#xff1a;取一个整数a从右端开始的4〜7位。 运算符描述实例&按位与运算符&#xff1a;参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a & b) 输出结果 12 &#xff0c;二进制解释&#xf…

数学建模学习笔记(四)——拟合算法

文章目录拟合算法简介一个线性规划的例子最小二乘法求解最小二乘法拟合检验总结拟合算法简介 与插值算法不同&#xff0c;拟合算法的目的是得到一条确定的曲线&#xff1b;而插值是根据已有的数据来获得一系列新的“靠谱”的数据。插值要求曲线必须全部经过样本数据点&#xf…

没有bug队——加贝——Python 55,56

55.题目&#xff1a;学习使用按位取反~。 说明&#xff1a; 二进制数在内存中以补码的形式存储。 按位取反&#xff1a;二进制每一位取反&#xff0c;0 变 1&#xff0c;1 变 0。 最高位为符号位&#xff0c;正数的符号位为 0&#xff0c;负数为 1。 对正数来说&#xff0…

数学建模学习笔记(五)——相关系数以及假设检验

文章目录皮尔逊相关系数假设检验下面来看一个例子斯皮尔曼(spearman)相关系数注意皮尔逊相关系数 总体皮尔逊&#xff08;Pearson&#xff09;相关系数 如果有 A:{A1,A2,⋯,An}A:\{A_1, A_2, \cdots, A_n\}A:{A1​,A2​,⋯,An​} 和 Y:{Y1,Y2,⋯,Yn}Y:\{Y_1, Y_2, \cdots, Y_n\…

没有bug队——加贝——Python 57,58

相关 tkinter 的介绍&#xff1a;Python 55&#xff0c;56 目录 57.题目&#xff1a;画图&#xff0c;学用line画直线。 58.题目&#xff1a;画图&#xff0c;学用rectangle画方形。   57.题目&#xff1a;画图&#xff0c;学用line画直线。 #57 from tkinter import *c…

C语言高级输出及进阶

在C语言中&#xff0c;有三个函数可以用来在显示器上输出数据&#xff0c;它们分别是&#xff1a; puts()&#xff1a;只能输出字符串&#xff0c;并且输出结束后会自动换行。putchar()&#xff1a;只能输出单个字符。printf()&#xff1a;可以输出各种类型的数据。printf() 是…