数据在内存中的存储(深度剖析)

news/2024/11/23 2:08:24/

目录

1.数据类型介绍

1.1类型分类

2.整形在内存中的存储

2.1原码,反码,补码

2.2大小端介绍

2.3练习

3.浮点型在内存中的存储

3.1浮点数存储规则


引入:

正负的数据可以存放在有符号的变量中

只有正数的数据可以存放在无符号的变量中

如果是有符号的数据,最高位是符号位,最高位是0,表示正数,最高位是1,表示负数

对于无符号数来说,最高位也是数据位

1.数据类型介绍

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

 类型的意义:

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

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

1.1类型分类

整形家族

char 

        unsigned char

        signed char

short 

        unsigned short

        signed char 

int 

        unsigned int 

        signed int

long 

        unsigned long

        signed long 

其中,若定义

char c; //不能确定char是否有符号,往往取决于编译器

char在内存中只占用一个字节,一个字节占8个比特位,取值范围是-128~127

浮点数家族

float

double

long double

 构造类型

 数组类型  eg:int arr[10];//arr的类型是int[10]
 结构体类型 struct
 枚举类型 enum
 联合类型 union

指针类型

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

指针变量是用来存放地址的

空类型

void 表示空类型(无类型)

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

2.整形在内存中的存储

2.1原码,反码,补码

整数有此三种表现方法,均有符号位和数值位,符号位0为正,1为负。

如何表示负整数?

原码:直接将数值按照正负数的形式翻译成二进制

反码:符号位不变,其他位按位取反

补码:反码+1,即得到补码

正数的原反补码相同

int main()
{int a = 10;//正数的原反补码都一样//0000 0000 0000 0000 0000 0000 0000 1010int b = -10;//1000 0000 0000 0000 0000 0000 0000 1010//1111 1111 1111 1111 1111 1111 1111 0101//1111 1111 1111 1111 1111 1111 1111 0110return 0;
}

对于整形来说:数据存放内存中其实存放的是补码,为何?

使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器);此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

 2.2大小端介绍

什么是大小端:

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

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

 判断大小端

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

2.3练习

#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);//-1 -1 255return 0;
}

无符号char类型打印整形会发生整形提升

如何进行整形提升?

1.查看所要整形提升的变量原类型是什么

2.若是无符号类型,高位补0直到32位即可

   若是有符号类型,看最高位(符号位)是什么,是0补0,是1补1

上题为例:unsigned char c = -1;//是无符号数char类型,输出为整形时需要发生整形提升

补码:1111 1111

发生整形提升,原类型是无符号类型

0000 0000 0000 0000 0000 0000 1111 1111

二进制转十进制--->255

3.浮点型在内存中的存储

3.1浮点数存储规则

根据IEEE754规定,任意一个二进制浮点数V可以表示为

(-1)^S * M * 2^E
(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位。

对于32位的浮点数,最高位是符号位s,接着的8位是指数E,剩下的23位为有效数字M

 IEEE754对有效数字M和指数E,还有一些特别的规定

1<M<2时,M写成1.xxx的形,其中xxx表示小数部分,而第一位“1”可以省去

指数E:E=e+127

eg:

真值:0.5

二进制:0.1

----> (-1)^0 * 1.0*2^(-1)  其阶码E=-1+127=126---->0111 1110

则其二进制表示形式:0 0111 1110 0000 0000 0000 000

                                    s        E                      M

E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,
有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

E全为1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);


http://www.ppmy.cn/news/39933.html

相关文章

java设计模式(2)单例模式、工厂模式、建造者模式

单例模式 单例对象的类必须保证只有一个实例存在 饿汉式单例 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用&#xff0c;以后不再改变&#xff0c;所以天生是线程安全的 //饿汉式单例类. public class Singleton {//构造器私有化private Singleton() {}//stat…

五子棋透明棋盘界面设计(C语言)

五子棋透明棋盘设计&#xff0c;漂亮的界面制作。程序设置双人对奕&#xff0c;人机模式&#xff0c;对战演示三种模式。设置悔棋&#xff0c;记录功能&#xff0c;有禁手设置。另有复盘功能设置。 本文主要介绍透明的玻璃板那样的五子棋棋盘的制作。作为界面设计&#xff0c;…

Kriging 克里金算法Java实现

引入依赖库 import java.util.ArrayList; import java.util.Arrays; import java.util.List;定义一个类来表示二维坐标点 class Point {double x;double y;double z;Point(double x, double y, double z) {this.x x;this.y y;this.z z;}double distance(Point other) {doubl…

Java基础-单元测试和反射的相关内容

系列文章目录 JavaSE基础的单元测试和反射相关内容的学习 文章目录系列文章目录前言一、单元测试1.单元测试概述2.单元测试快速入门3.单元测试常用注解二、反射1.反射概述2.反射获取类对象3.反射获取构造器对象4.反射获取成员变量对象5.反射获取方法对象6.反射的作用—泛型擦除…

利用docker搭建云渗透测试靶场

文章目录 前言Docker的安装1、Linux内核版本查看2、更新apt源满足下载要求3、进行系统或工具的更新4、采用apt安装Docker云靶场腾讯云 COS Bucket 公开访问场景场景搭建部署靶场销毁环境前言 Docker是渗透测试中必学不可的一个容器工具,在其中,我们能够快速创建、运行、测试以…

Jmeter接口测试和性能测试

目前最新版本发展到5.0版本&#xff0c;需要Java7以上版本环境&#xff0c;下载解压目录后&#xff0c;进入\apache-jmeter-5.0\bin\&#xff0c;双击ApacheJMeter.jar文件启动JMemter。 1、创建测试任务 添加线程组&#xff0c;右击测试计划&#xff0c;在快捷菜单单击添加-…

Java 网络编程之NIO(Channel)

同步 VS 异步 同步 同步编程是指当程序执行某个操作时&#xff0c;它必须等待该操作完成才能继续执行下一个操作。这意味着程序在执行网络请求时必须等待网络请求完成才能继续执行下一步操作&#xff0c;因此同步编程通常会导致程序的性能降低。在网络编程中&#xff0c;同步编…

透视Android系统AMS、PMS和WMS,了解开发中的重要角色

原理 在Android系统中&#xff0c;AMS&#xff08;Activity Manager Service&#xff09;、PMS&#xff08;PackageManager Service&#xff09;和WMS&#xff08;Window Manager Service&#xff09;是三个重要的系统服务&#xff0c;它们负责管理应用程序的生命周期、处理应…