【C语言】 数据的存储 -- 数据类型介绍 -- 存储 -- 浮点型在内存中的存储,很详细也很重要,不明白的一定要看2

简介: 【C语言】 数据的存储 -- 数据类型介绍 -- 存储 -- 浮点型在内存中的存储,很详细也很重要,不明白的一定要看2

2.2 大小端介绍

什么是大端小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。

讲简单点:

为什么有大端和小端:


这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。


我们可以想到,超过了一个字节序就会出现排放顺序的问题。


如果我们从内存中拿出来这个数字乱序肯定是不行的,因此就只剩下正着存和反着存。

因此就定义了大端字节序存储,小端字节序存储。

我们再进到 vs 编译器中看是如何存储的



2.3 练习

i>写出一个检测大小端的函数

//如果是大端返回0
//如果是小端返回1
#include <stdio.h>
int check_sys()
{
  int a = 1;
  return *(char*)&a;
}
int main()
{
  if (1 == check_sys())
    printf("小端\n");
  else
    printf("大端\n");
  return 0;
}


分析:

int 类型是4个字节,要取出1个字节我们对 a 的地址强转为 char* 再解引用,这样取出的数字不是 1 就是 0 。

ii>看这段代码给出结果

#include <stdio.h>
int main()
{
  char a = -1;
  signed char b = -1;
  unsigned char c = -1;
  printf("a = %d, b = %d, c = %d\n", a, b, c);
  return 0;
}

效果展示:

注:%d打印的是十进制的有符号数,%u打印的是十进制的无符号数。

如果(unsigned)char 类型变量赋值为负数,再用 %u 打印,是把负数整型提升后的补码当作原码解读后来打印。

Q:为什么是这样的值呢?

分析:

这里的 signed char b 和 char a 是一样的。

引申:

char 的取值范围:

char 的取值范围是一个环状的,取出的值只会在这个范围里。

iii> 看这段代码给出结果

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

效果展示:

Q:这是为什么呢?

A:如果(unsigned)char 类型变量赋值为负数,再用 %u 打印,是把负数整型提升后的补码当作原码解读后来打印。

iv> 看这段代码给出结果

#include <stdio.h>
int main()
{
  int a = -20;
  unsigned int b = 10;
  printf("%d\n", a+b);
  return 0;
}

效果展示:

因为 %d 打印的是有符号数。

v> 看这段代码给出结果

#include <stdio.h>
#include <windows.h>
int main()
{
  unsigned int i = 1;
  for (i = 9; i >= 0; i--)
  {
    printf("%u\n", i);
    Sleep(1000);
  }
  return 0;
}

效果展示:

分析:

这段代码会死循环。

vi> 看这段代码给出结果

#include <stdio.h>
#include <string.h>
int main()
{
  char a[1000];
  int i = 0;
  for (i = 0; i < 1000; i++)
  {
    a[i] = -1 - i;
  }
  printf("%d", strlen(a));
  return 0;
} 

效果展示:

分析:


二进制不断 +1/-1 是在这个圆上不断轮回。

vii> 看这段代码给出结果

#include <stdio.h>
unsigned char i = 0;
int main()
{
  for (i = 0; i <= 255; i++)
  {
    printf("hehe\n");
  }
  return 0;
}

效果展示:

分析:

光标一直在闪烁,说明代码是死循环的。unsigned char 的取值范围是 0 ~ 255的,i<=255的条件是恒成立的,因为i++不断执行都是在轮回。



相关文章
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
3801 0
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
511 26
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
627 15
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
1274 1
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
1794 0
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
1029 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
757 6
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
829 1
|
存储 C语言
【C语言】四行代码说明浮点型在内存中的储存
【C语言】四行代码说明浮点型在内存中的储存
【C语言】四行代码说明浮点型在内存中的储存