下面先介绍一下这章要让大家了解的基本内容:
一.数据类型详细介绍
二.整形在内存中的存储:原码、反码、补码
三.大小端字节序介绍及判断
四.浮点型在内存中的存储解析
一.数据类型详细介绍
首先我们先简单介绍一下基本数据类型,想必大家已经了解过一些基本的内置类型:
例如:
char | 字符数据类型 (占用 1 个字节) |
short | 短整型 (占用 2 个字节) |
int | 整形 (占用 4 个字节) |
long | 长整形 (占用 4 个或者 8 个字节) |
long long | 更长的整形 (占用 8 个字节) |
float | 单精度浮点型 (占用 4 个字节) |
double | 双精度浮点型 (占用 8 个字节) |
类型的意义:
1.使用这个类型开辟内存空间的大小(大小决定了使用范围)。
2.如何看待内存空间的视角
我们对数据类型进行了简单的分类:
整形家族:
常规写法 | 完整写法 | 表示的数据范围 |
char | signed char (有符号的 char) | -128 ~ 127 |
unsigned char | unsigned char(无符号的 char) | 0 ~ 255 |
short | signed short(有符号的 short) | -32768 ~ 32767 |
unsigned short | unsigned short (无符号的 short) | 0 ~ 65535 |
int | signed int(有符号的 int) | -2147483648~2147483647 |
unsigned int | unsigned int(无符号的 int) | 0 ~ 4294967295 |
long | signed long(有符号的 long) | -2147483648~2147483647 |
unsigned long | unsigned long(无符号的long) | 0 ~ 4294967295 |
注意:1,我们通常写的int 等价于 signed int,其他整形类型同理。
2.char 也在整形家族中, 虽然char是字符类型,但是字符类型在存储的时候,存储的是字符的 ASCII 码值,ASCII码值是整数。
3.例如在char c1这个字符型变量中;char到底是有符号还是无符号其实是不确定的,这取决于编译器,不过大多数的编译器都是吧char当做signed char。
看到这里,有的小伙伴就开始疑惑了,什么是有符号signed ? 什么是无符号unsigned呢?
有符号与无符号讲解:
在说有符号和无符号之前,先给大家举个例子:
比如:温度,温度是有正负的,比如零下15度表示为 -15℃,零上20表示为20℃,像这种有正负的数据可以存放在有符号的变量中
例如:生活中人的年龄只有正数,没有负数,像这种只有正数的数据可以存放在无符号的变量中。
知道这个例子后我们先提一个问题:
如果需要表示的整数大于了 int 能表示的最大值怎么办?
我们可以用short 和 int 来回答这个问题。
-- short能表示的最大值为:32767,如果short 能表示的最大值加1会得到什么?
--int 能表示的最大值为:2147483647,如果int能表示的最大值加1会得到什么?
下面我们用代码找答案:
注意:这样的错误写法不会让程序奔溃,仅仅运行结果很奇怪。
不要急,我们继续往下看:
-- short能表示的最小值为:-32768,如果short 能表示的最小值减1会得到什么?
--int 能表示的最小值为:-2147483648,如果int能表示的最小值减1会得到什么?
下面我们用代码找答案:
结论:所以我们从以上两个例子的结果可以得出如果越界就会发生回转,最大值加一就会回转到最小值,最小值减一就会回转到最大值。
有符号与无符号
--signed int和 unsigned int所能表示的整数个数是一样的,仅仅是最大值和最小值不同,例如:
signed int 的范围:-2147483648 ~ 2147283647
unsigned int 的范围:0 ~ 4294967295
二.整形在内存中的存储:原码、反码、补码
计算机的整数有三种表示方法,即原码、反码、补码
三种表示方法均有符号位和数值位两部分:符号位都是 0 表示“正”,符号位是1 表示“负”,而数值位负整数的三种表示方法不同。
整数可以写出三种二进制表示形式:原码、反码、补码。
首先用正整数10举个例子:
从以上代码可以得出结论:正整数的原码、反码、补码相同
在此基础上接下来我们用负整数-10来举个例子进行对比: