【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++不断执行都是在轮回。



相关文章
|
6月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
5月前
|
消息中间件 存储 缓存
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
|
6月前
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
7月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
212 12
|
7月前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
1月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
218 55
|
2月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
126 6
|
3月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
226 29
JVM简介—1.Java内存区域
|
7月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
1321 1
|
3月前
|
消息中间件 Java 应用服务中间件
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
111 12
JVM实战—2.JVM内存设置与对象分配流转

热门文章

最新文章