目录
一、实验环境二、C语言整数简介1、类型说明符(1) signed和unsigned(2) 省略书写2、sizeof运算符-计算当前环境下各类型的字节数三、整数存储-原码,反码,补码1、原码2、反码3、补码4、小结四、总结五、文末声明一、实验环境
Windows 10 系统
Visual Studio
二、C语言整数简介
1、类型说明符
这里需要注意,上述字节数是我当前环境下的字节数。C语言中规定:长整型(long int)至少和整型(int)一样长,整型(int)至少和短整型(short int)一样长,即short int <= int <= long int
。
编译系统给int型数据分配的内存可能是2个字节或是4个字节,具体由编译系统自行决定。例如:Turbo C 2.0分配的是2个字节,而Visual C++则分配4个字节。1
(1) signed和unsigned
C语言中整数分为有符号类型(signed
)和无符号(unsigned
)类型。如果没有显示说明为unsigned,则默认为signed。例如:int a即signed int a,long int a即signed long int a。
signed:最高位为符号位,0表示正号,1表示负号。剩下的位数表示数值。
unsigned:没有符号位,所有位数都表示数值。
(2) 省略书写
当int前有signed,unsigned,short,long,long long修饰的时候,int可以省略不写。例如:signed a即signed int a,unsigned a即unsigned int a,unsigned long a即unsigned long int a。
2、sizeof运算符-计算当前环境下各类型的字节数
C语言中sizeof
是一个运算符,而不是函数。以字节为单位返回运算对象的大小。运算对象可以是具体的数据对象(如,变量名)或类型。如果运算对象是类型(如,float),则必须用圆括号将其括起来。所以sizeof a,sizeof(a),sizeof(float)都是合法的,其中a是变量名。
sizeof返回size_t
类型的值,这是一个无符号整数类型。C头文件系统会使用typedef把size_t作为unsigned int或unsigned long的别名。C99新增%zd
转换说明用于printf()显示size_t类型的值,如果编译器不支持%zd,请将其改成%u或%lu。
#include<stdio.h>int main(void){printf("short int = \t%zd\n", sizeof(short int));//其中\t是制表符,\n是回车换行printf("int = \t\t%zd\n", sizeof(int));printf("long int = \t%zd\n", sizeof(long int));printf("long long int = %zd\n", sizeof(long long int));return 0;}
输出:
short int =2int = 4long int =4long long int = 8
三、整数存储-原码,反码,补码
我解释的很简单,建议看这篇:原码、反码、补码知识详细讲解
下面我以单字节有符号整数1和-1为例:
1、原码
+1:0000 0001 —— 最高位0为符号位,表示正数
-1:1000 0001 —— 最高位1为符号位,表示负数
2、反码
正数的反码与原码相同,负数的反码:符号位不变,其他位取反,即0变1,1变0。
+1:0000 0001
-1:1111 1110
3、补码
正数的补码与原码相同,负数的补码:符号位不变,其他位取反后(即反码)加1
+1:0000 0001
-1:1111 1111
4、小结
正数:原码 = 反码 = 补码
负数:原码 ≠ 反码 ≠ 补码
0 表示为 0000 0000。
正数的范围:1 ~ 127:0000 0001 ~ 0111 1111。
负数的范围:-128 ~ -1:1000 0000 ~ 1111 1111
这里存在一个特殊的数-128
:
在0的表示上出现了特殊情况。数学中没有+0和-0之分,因为0既不是正数也不是负数。现在我们已经将0000 0000表示成为0,那1000 0000怎么办呢?如果某个数的原码是1000 0000,求其补码,符号位不变,剩余位取反加1,出现了溢出,将溢出位省去,得到的还是1000 0000。在计算机的内部表示中,就将1000 0000定义成数字-128。(我记得书上好像说-128不能求原码和反码,就是强行定义的。我不确定啊,疫情期间,书在学校,人在家中,无法求证。)
计算机采用补码表示负数,是为了避免减法,将减法转换成了加法。所以计算机里只有加法器而没有所谓的减法器。
四、总结
C语言中整型分为有符号和无符号两种。各种类型所能表示数的范围有所不同,根据实际情况选取合适的类型。最常用的是int,不过有时需要存储的数超出int的范围,需要考虑long或者long long(我当前环境下long和int的范围是一样的)。sizeof是运算符而不是函数,返回值类型是size_t,这是一个typedef定义的一个无符号整型的别名。运算对象是类型说明符时,必须加上括号。原码、反码、补码,存储负数,消灭减法。五、文末声明
我学习参考的是书本和网络,文章旁征博引(这是个好词),对引用的部分我都标上了链接,有些遗漏的或者一两句话没标注的,如果侵权万分抱歉,联系我后必删。
我写博客旨在监督自己学习,与大家分享学习成果,脚踏实地,一步踩死一个bug。由于本人水平极其有限,文中有出错的地方还请读者批评指正。
C语言中 int、long、long long 的存储空间和值的范围 ↩︎