从零开始学习C++(十九.整数类型)

294 阅读3分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

前言

前面讲了一下C++中的字符串,今天学习了下数字。数字是C++中非常常见的原始的数据类型,它和其他语言有点不一样,它比较底层,不同的长度限制的整数类型有一些最小值和最大值,也有无符号和有符号之分。

有符号类型

声明整数类型的时候默认就是有符号类型,也最常见,所以先看看有符号类型,有符号类型就是能表示的整数的范围包含负数,先列举几个有符号的数据类型:

名称长度范围
char1字节-128〜127
short int2字节-256〜255
int4字节-2,147,483,648〜+2,147,483,647
long int4字节-2,147,483,648〜+2,147,483,647
long long int8字节-9,223,372,036,854,775,808~+9,223,372,036,854,775,807

无符号类型

有符号类型的整数那就是没有正负的符号,范围只能从0开始:

名称长度范围
unsigned char1字节0〜255
unsigned short int2字节0〜65535
unsigned int4字节0〜4294967295
unsigned long int4字节0〜4294967295

整数类型的范围是根据长度推算出来的,上篇文章就说明了1个字节能存储八个位的0或者1,八个1的话就是最大的一个字节能存的数,二进制数11111111(8个1)转换成人类常用的十进制就是255:

image.png 有符号的话就要拿一位出来用来表示正负号,所以1111111(7个1)转换成十进制就是127

image.png 有符号整数在计算机内是以二进制补码形式存储的,其最高位为符号位“0”表示“正”,“1”表示“负”

由以上知识就能简单看的出来这些范围是怎么推算出来的了。

补码

如果直接使用0或1用来表示整数或负数那就分不清楚第一位是真实的数字还是符号,再说的话也非常浪费存储空间,所有的数字都是有符号的类型了,都有一个位表示正负数。 有符号是以补码的形式,要了解补码就要哦了解补码和反码,来举个例子:
原码:
十进制的1用一个字节表示的话就是 0000 0001
十进制的-1用一个字节表示的话就是 1000 0001
反码:
反码就是0和1颠覆的原码
十进制的1用一个字节表示的话就是 1111 1110
十进制的-1用一个字节表示的话就是 0111 1110
补码:
正数的补码是本身,负数的反码就是负数的反码加一,这句话非常重要!!! 十进制的1用一个字节表示的话就是 0000 0001 补码 = 0000 0001 十进制的-1用一个字节表示的话就是 0111 1110 补码 +1 = 0111 1111

补码反码就是为了简化减法而来的,将减号化为负数 再将负数化为补码求加法 跟正数没关系。不管是正整数还是正小数,原码,反码,补码都全部相同,计算机中所有数都是以补码形式存储的。

总结

今天看了一下范围,了解了一下范围计算的原理,还了解了一下计算机地层中补码,反码,原码的知识,非常有意思。