文章目录
前言
下文中将会详细介绍数据的存储及一些相关的知识,如果觉得本文对你有所帮助,就请点个赞再走吧!!
本文以 win 32 操作系统为例。
1. 数据类介绍
注意:
- 一个字节(byte) = 8个比特位(bit)
- 符号位是之个数二进制表示时的第一位,第一位为0则表示正数,第一位为1则表示负数。
1.1 整形
包括char 、short 、int 、long 、long long 等。
1.1.1 char类型
注:char 类型的字符在存储时是以其ASCII 码的值存储在内存中的,所以其也归类在整形中。
大小:1个字节(byte)
char 类型包括:char 型、有符号字符(signed char)、无符号字符(unsigned char)三种。
如果只输入一个 char 类型的字符,那么这个字符可能是有符号的字符,也可能是无符号的字符,具体是什么类型要取决于编译器。
1.1.2 short类型
注:short 型即 short int 型,全称:短整型
- 大小:2个字节(byte)
- short 类型包括:有符号短整型(signed short)、无符号短整型(unsigned short)两种。
- 如果只输入一个 short 类型的数,则编译器会默认这个数的类型为有符号短整型。
1.1.3 int类型
- 大小:4个字节(byte)
- int 类型包括:有符号整型(signed int)、无符号整型(unsigned int)两种。
- 如果只输入一个 int 类型的数,则编译器会默认这个数的类型为有符号整型。
1.1.4 long型
注:long 型即 long int 型,全称:长整型
- 大小:4或8个字节(byte)
- long 类型包括:有符号长整型(signed long)、无符号长整型(unsigned long)两种。
- 如果只输入一个 long 类型的数,则编译器会默认这个数的类型为有符号长整型。
1.1.5 long long 型
注:long long型即 long long int 型,全称:长整型
long long是C++的正式标准,这也就意味着,该类型不会因为编译器或者开发平台的不同而有所差异,而且与一些系统函数、类库都有很好的交互(如常见的printf、scanf、cin和cout等)。
- 大小:8个字节(byte)
- long long类型包括:有符号长整型(signed long long)、无符号长整型(unsigned long long)两种。
- 如果只输入一个 long long类型的数,则编译器会默认这个数的类型为有符号长整型。
1.2 浮点型
包括 float、 double 等‘
1.2.1 float 型
名称:单精度浮点型
大小:8个字节(byte)
1.2.2 double 型
名称:双精度浮点型
大小:8个字节(byte)
1.3 构造类型(也称为自定义类型)
- 数组类型
- 结构体类型:struct
- 枚举类型:enum
- 联合类型:union
1.4 指针类型
- char*
- int*
- float*
- double*
- void*(相当于一个垃圾桶,任何类型的指针地址都可以放在里面,但使用时编译器无法判断其是何种类从而会导致报错。一般应用于临时存放一个指针地址,用的时候进行强制类型转换)
…
1.5 空类型
void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型 等。
2. 整形在内存中的存储
注:整形类型的取值范围限定在:limits.h 中
1. 计算机中储存的是二进制的补码但调试时显示的是十六进制的补码,储存时以字节位单位进行存储;如:
int a=0x12345678 它调试时显示的地址所对应的内容为 78 56 34 12
a=0x12345678 的二进制是:
1 2 3 … 7 8
0001 0010 0011 … 0111 1000
所以一个16进制为是4个比特位,两个16进制位为一个字节,所以其在内存中的表示如上所述。
2. 计算时也是使用二进制补码进行计算。
2.1 原码、反码、补码
- 计算机中的整形有三种二进制表示方法,即 原码、反码、补码。
- 三种表示法均有符号位和数值位两部分。
符号位:都用“0”表示“正”,用“1”表示“负”。
数值位:
正数的原码、反码、补码都相同;
例:10的原码、反码、补码
00000000000000000000000000001010 原码
00000000000000000000000000001010 反码
00000000000000000000000000001010 补码
负数的三种表示方法各不相同;
3. 负数的原码、反码、补码关系:
原码符号位不变其它位按位取反得到反码
反码 +1 得到补码
例 :-10的原码、反码、补码
10000000000000000000000000001010 原码
111111111111111111111111111111110101 反码
111111111111111111111111111111110110 补码
2.2 大小端的介绍
2.2.1 什么是大小端
1.小端字节序存储:
低位字节的内容放在低地址中,高位字节的内容放在高地址中;如:
假设两个地址0x0010(低地址)和0x0011(高地址) ,一个数 a = 0x1122 , 11是高位字节,22是低位字节,将 22 放在0x0010中,将11放在0x0011中,就是小端字节序存储。2211
- 大端字节序存储:
高位字节的内容放在低地址中,低位字节的内容放在高地址中;如:
假设两个地址0x0010(低地址)和0x0011(高地址) ,一个数 a = 0x1122 , 11 是高位字节, 22 是低位字节,将 11 放在0x0010中,将 22 放在0x0011中,就是大端字节序存储。1122
- 判断是大端字节序存储还是小端字节序存储:
#include<stdio.h>
int main()
{
int a=1; //00 00 00 01
char* p=(char*)&a;
if(*p==1)
{
printf("小端字节序存储");
}
else
{
printf("大端字节序存储");
}
return 0;
}
//也可定义一个函数
int check_sys()
{
int i=1;
return (*(char*)&i);
}
int main()
{
int ret=check_sys();
if(ret==1)
{
printf("小端字节序存储");
}
else
{
printf("大端字节序存储");
}
return 0;
}
3. 浮点型数在内存中的存储
注:浮点型类型的取值范围限定在:float.h 中
- 浮点数转二进制:
例:
写出 5.625 的二进制表示形式
5 = 101
即 1 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0
= 4 + 0 + 1
=5
0.625 = .101
即 1 * 2 ^ (-1) + 0 * 2 ^ (-2) + 1 * 2 ^ (-3)
=0.5 + 0 + 0.125
=0.625
所以 5.625 的二进制表示形式就是 101.101
2. 有一些浮点数在内存中是无法精确表达的,只能无限接近,如:3.3 、 3.14 等,这就是浮点数丢失精度的原因
3.1 浮点数的存储规则
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
(-1) ^ S * M * 2 ^ E ( 科学计数法)
释义:
^ : 次方
(-1)^ S : 表示符号位,当S=0,V为正数,当S=1,V为负数。
M : 表示有效数字,大于等于1,小于2。
2 ^ E : 表示指数位,E 为一个无符号整数。但在科学计数法中,E可以是负数。
例:
由于博主现阶段实力有限,无法有条理的讲清楚单、双精度在内存中的存储,所以给各位推荐一篇好文,CSDN博主“明月几时有666”的博客:
链接: link
总结
以上就是今天要讲的内容,本文仅简单介绍了数据在内存中的存储,更深层次请移步链接。
如果觉得本文对您有所帮助,请点赞关注支持博主!