【C语言中数据的存储】

发布于:2023-01-22 ⋅ 阅读:(222) ⋅ 点赞:(0)


在这里插入图片描述

前言

下文中将会详细介绍数据的存储及一些相关的知识,如果觉得本文对你有所帮助,就请点个赞再走吧!!
本文以 win 32 操作系统为例。


1. 数据类介绍

注意:

  1. 一个字节(byte) = 8个比特位(bit)
  2. 符号位是之个数二进制表示时的第一位,第一位为0则表示正数,第一位为1则表示负数。

1.1 整形

包括char 、short 、int 、long 、long long 等。

1.1.1 char类型

注:char 类型的字符在存储时是以其ASCII 码的值存储在内存中的,所以其也归类在整形中。

  1. 大小:1个字节(byte)

  2. char 类型包括:char 型、有符号字符(signed char)、无符号字符(unsigned char)三种。

  3. 如果只输入一个 char 类型的字符,那么这个字符可能是有符号的字符,也可能是无符号的字符,具体是什么类型要取决于编译器。

1.1.2 short类型

注:short 型即 short int 型,全称:短整型

  1. 大小:2个字节(byte)
  2. short 类型包括:有符号短整型(signed short)、无符号短整型(unsigned short)两种。
  3. 如果只输入一个 short 类型的数,则编译器会默认这个数的类型为有符号短整型。

1.1.3 int类型

  1. 大小:4个字节(byte)
  2. int 类型包括:有符号整型(signed int)、无符号整型(unsigned int)两种。
  3. 如果只输入一个 int 类型的数,则编译器会默认这个数的类型为有符号整型。

1.1.4 long型

注:long 型即 long int 型,全称:长整型

  1. 大小:4或8个字节(byte)
  2. long 类型包括:有符号长整型(signed long)、无符号长整型(unsigned long)两种。
  3. 如果只输入一个 long 类型的数,则编译器会默认这个数的类型为有符号长整型。

1.1.5 long long 型

注:long long型即 long long int 型,全称:长整型
long long是C++的正式标准,这也就意味着,该类型不会因为编译器或者开发平台的不同而有所差异,而且与一些系统函数、类库都有很好的交互(如常见的printf、scanf、cin和cout等)。

  1. 大小:8个字节(byte)
  2. long long类型包括:有符号长整型(signed long long)、无符号长整型(unsigned long long)两种。
  3. 如果只输入一个 long long类型的数,则编译器会默认这个数的类型为有符号长整型。

1.2 浮点型

包括 float、 double 等‘

1.2.1 float 型

名称:单精度浮点型
大小:8个字节(byte)

1.2.2 double 型

名称:双精度浮点型
大小:8个字节(byte)

1.3 构造类型(也称为自定义类型)

  1. 数组类型
  2. 结构体类型:struct
  3. 枚举类型:enum
  4. 联合类型:union

1.4 指针类型

  1. char*
  2. int*
  3. float*
  4. double*
  5. 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 原码、反码、补码

  1. 计算机中的整形有三种二进制表示方法,即 原码反码补码
  2. 三种表示法均有符号位数值位两部分。
    符号位:都用“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

  1. 大端字节序存储:

高位字节的内容放在低地址中,低位字节的内容放在高地址中;如:
假设两个地址0x0010(低地址)和0x0011(高地址) ,一个数 a = 0x1122 , 11 是高位字节, 22 是低位字节,将 11 放在0x0010中,将 22 放在0x0011中,就是大端字节序存储。1122

  1. 判断是大端字节序存储还是小端字节序存储:
#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 中

  1. 浮点数转二进制:
    例:
    写出 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


总结

以上就是今天要讲的内容,本文仅简单介绍了数据在内存中的存储,更深层次请移步链接。

如果觉得本文对您有所帮助,请点赞关注支持博主!

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到