【C语言】数据存储(上)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 【C语言】数据存储(上)

本章介绍:


  1. 数据类型详细介绍
  2. 整形在内存中的存储:原码、反码、补码
  3. 大小端字节序介绍及判断
  4. 浮点型在内存中的存储解析


1. 数据类型介绍



char        字符数据类型
short       短整型
int         整形
long        长整型
long long   更长的整形
float       单精度浮点数
double      双精度浮点数


类型的意义:


1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。

2. 如何看待内存空间的视角。


1.1 类型的基本归类


☀️整形家族:


  • 1: char:

unsigned char 无符号整型

signed char 有符号整形

char型用来储存字符,但是计算机用数字编码储存字符,如ASCII码值存储的是整数,所以字符和整形均可以表示char型。

❗️ C语言没有规定char类型本身是属于无符号还是有符号,这个是取决于编译器的

  • 2: short

unsigned short [int]
signed short [int]

  • 3: int

unsigned int

signed int

  • 4:long

unsigned long [int]

signed long [int]


☀️:浮点数家族:


float

double


☀️:构造类型:


数组类型

结构体类型 struct

枚举类型 enum

联合类型 union


☀️:指针类型:


int pi;
char pc;
float
pf;
void
pv;

void 表示空类型(无类型)

通常应用于函数的返回类型、函数的参数、指针类型。


2. 整形在内存中的存储



我们之前讲过一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的


那接下来我们谈谈数据在所开辟内存中到底是如何存储的?


2.1 原码、反码、补码


☀️:计算机中的整数有三种->整数的二进制表示形式有3种: 原码、反码、补码 。整数在内存中存储的是: 补码(2进制)


三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位

正整数的原码、反码、补码是相同的

⭐️ 负整数的原码、反码、补码是要计算的


☀️:负整数的三种表示方法各不相同。


  • 原码

直接将数值按照正负数的形式翻译成二进制就可以得到原码。

  • 反码

将原码的符号位不变,其他位依次按位取反就可以得到反码。

  • 补码

反码+1就得到补码。
⭐️对于整形来说:数据存放内存中其实存放的是补码。


举例:int a =-1 在内存中如何存储,

-1的二进制表示方法是 10000000 00000000 00000000 00000001 这是原码

原码 -> 10000000 00000000 00000000 00000001

反码 -> 111111111 111111111 111111111 111111110 (原码的符号位不变,其他位依次按位取反就可以得到反码)

补码 -> 111111111 111111111 111111111 111111111 (反码+1就得到补码)

-1在内存中存储的二进制补码就是111111111 111111111 111111111 111111111


🌟当然他们也是相辅相成的,既可以把原码转换成补码,也可以把补码转换成原码,那如何转换呢?

有两种方法:

1:补码-1 取反

2:取反 +1

b8452221c93147b1afcce7dc22c8370a.png


2.2 大小端


☀️ 大小端介绍::


我们看看在内存中的存储:

我们可以看到对于a存储的是补码。但是我们发现顺序有点不对劲。

这是又为什么?


d206e42d8d32437ab1c0ff131b5d00dc.png

⭐️其实这就是大小端午存储方式,他们的存储模式各不相同


  • 大端(存储)模式:

是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中;

  • 小端(存储)模式:

是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。


举例: int a = 0x11223344 图解

小端:数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中


34c91740dcb748d9bac91eac19e6acf4.png


大端:数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中


c29e6de093904d7ca10525fccb216f4a.png

我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

⭐️:那如何判断当前机器是大端还是小端呢?


  • ☀️ 判断大小端::


#include<stdio.h>
int main()
{
  int a = 1;
  char* pa =(char*) & a;
  if (*pa == 0)
    printf("大端存储\n");
  else if(*pa ==1)
    printf("小端存储\n");
  return 0;
}


解析:


因为1的内存显示补码是 0x00 00 00 01

如果是小端存储会是 01 00 00 00

如果是大端存储会是 00 00 00 01

我们只需要用一个char*指针来访问第一个字节即可知道是否是 00还是01。


2.3 练习巩固


  • 练习1 :下面代码输出什么❓


1.
//输出什么?
#include <stdio.h>
int main()
{
    char a= -1;
    signed char b=-1;
    unsigned char c=-1;
    printf("a=%d,b=%d,c=%d",a,b,c);
    return 0;
}


☀️ 解析:


⭐️ char a = -1

signed char b= -1 的输出原理跟a一样

acde01b0e140438b914c9d052cfb09fb.png


⭐️ unsigned char c=-1;


67cb81145f424dff9ced5d701dbe3bd8.png

🌙->知识补充

有符号的负数如果发生整型提升高位补充符号位,即为1

有符号的正数如果发生整形提升高位补充符号位,即为0

unsigned无符号整形提升:高位补0即可


如对整型提升有不懂的可以看下此博客的 目录操作符->隐式类型转换


🌙 ->知识补充

有符号char的取值范围是 127 到 -128

unsigned 无符号char的取值范围是 0 到 255

以下图是char有符号类型的取值,存储的是补码

bbcb212f39c14bf7a685a0d9302da71d.png


  • 练习2 :下面代码输出什么❓


#include <stdio.h>
int main()
{
    char a = -128;
    printf("%u\n",a);
    return 0;
}


☀️ 解析:

34a02682052043a18c0e4070147577a5.png


  • 练习3 :下面代码输出什么❓


#include <stdio.h>
int main()
{
    char a = 128;
    printf("%u\n",a);
    return 0;
}


☀️ 解析:

c86d779d59454c04a9fd28aa7129ab4a.png


目录
相关文章
|
6月前
|
存储 编译器 C语言
c语言的数据存储
c语言的数据存储
40 1
|
11月前
|
存储 小程序 编译器
C语言数据的存储(上)
C语言数据的存储
144 1
|
存储 编译器 C语言
C语言之数据的存储一
C语言之数据的存储一
|
11月前
|
存储 人工智能 C语言
C语言数据的存储(下)
C语言数据的存储(上)
84 1
|
存储 小程序 编译器
C语言的数据存储
C语言的数据存储
|
存储 编译器 C语言
C语言中的数据存储
C语言中的数据存储
68 0
|
存储 C语言
【C语言】数据存储(下)
【C语言】数据存储(下)
89 0
|
存储 编译器 C语言
C语言之数据存储
C语言之数据存储
|
存储 C语言
c语言分层理解(c语言数据存储)(2)
. 数据类型介绍 1.1 数据类型介绍 char 字符数据类型、short 短整型、int 整型、long 长整型、long long 更长整型、float 单精度浮点数、double 双精度浮点数 类型大小: char类型占1个字节,short类型2个字节,int类型占4个字节,long类型占4个字节,long long类型占8个字节,float类型占4个字节,double类型占8个字节。 c语言中有字符串类型吗? 没有,字符串放进数组中的。
101 0
|
存储 程序员 编译器
c语言分层理解(c语言数据存储)(1)
1. 数据类型介绍 1.1 数据类型介绍 char 字符数据类型、short 短整型、int 整型、long 长整型、long long 更长整型、float 单精度浮点数、double 双精度浮点数 类型大小: char类型占1个字节,short类型2个字节,int类型占4个字节,long类型占4个字节,long long类型占8个字节,float类型占4个字节,double类型占8个字节。 c语言中有字符串类型吗? 没有,字符串放进数组中的。
185 0