1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C语言-整数:short int long long long(signed和unsigned) 原码 反码 补码

C语言-整数:short int long long long(signed和unsigned) 原码 反码 补码

时间:2024-02-14 06:12:35

相关推荐

C语言-整数:short int long long long(signed和unsigned) 原码 反码 补码

目录

一、实验环境二、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 的存储空间和值的范围 ↩︎

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。