C语言程序设计——数据在内存中的存储

news2024/9/23 21:17:54

一、数据类型介绍

1.基本内置类型

char         // 字符数据类型 1 B
short        // 短整型       2 B
int          // 整型         4 B
long         // 长整型       4 or 8 B
long long    //更长的整型    8 B
float        //单精度浮点型  4 B
double       //双精度浮点型  8 B

2.类型的基本归类

2.1 整型

char : //本质存储的是ASCII值,也是整型
    unsigned char
    signed char
short :
    unsigned short [int]
    signed short [int]
int :
    unsigned int
    signed int
long :
    unsigned long [int]
    signed long [int]
long long :
    unsigned long long [int]
    signed long long [int]

2.2 浮点型

float
double

2.3 构造类型(自定义类型)

数组类型    
结构体类型 struct
枚举类型 enum
联合类型 union

2.4 指针类型

int*
char*
float*
double*
void*
...

2.5 空类型void

        (1)void 表示空类型(无类型);

        (2)void不能直接用于定义变量,因为大小不明确;        

二、整型在内存中的存储

1. 原码、反码、补码

        计算机中的整数有三种表示方式:原码、反码、补码。

        三种表示方式均有符号位(最高位)和数值位两部分,符号位以0表示正,1表示负。

(1)正整数的表示方法

        原反补相同。

(2)负整数的表示方法

        原码:将数值按照正负数的形式翻译成对应的二进制;

        反码:将原码原有符号位不变,其他位按位取反;

        补码:反码+1;

2. 存储形式

        在计算机系统中,数值一律采用补码来表示和存储。

        使用补码的好处:

        (1)可以将符号位和数值部分统一处理;

        (2)cpu只有加法,使用补码可以将加法和减法统一处理;

        (3)补码与原码相互转换,其运算过程是相同的(补码符号位不变,其他位按位取反,再+1,可以得到原码),不需要额外的硬件电路。

3. 大小端存储

3.1 什么是大小端?

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

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

3.2 为什么会有大小端存储?

        在计算机系统中,是以字节为单位,每个地址单元都对应着一个字节,一个字节为8bit。而对于位数大于8的处理器,比如32位、64位等,由于寄存器宽度大于一个字节,那么就必然存在如何将多个字节进行安排的问题,因此就产生了大端存储模式和小端存储模式。

3.3 编程判断本机大小端问题

(1)通过获取低地址判断

	int a = 1; //0x 00 00 00 01
	if (*(char*)&a == 1) {
		printf("小端存储!\n");
	}
	else {
		printf("大端存储!\n");
	}

        通过两种存储方式的区别,获取a首地址读取第一个字节(低地址),如果结果是1则说明是小端存储,反之为大端存储。

(2)通过union特性判断

	union {
		int i;
		char ch;
	}un;

	un.i = 1;
	if (un.ch == 1) {
		printf("小端\n");
	}

三、浮点型在内存中的存储

1. 浮点数存储规则

        根据国际标准IEEE 754,任意一个二进制浮点数V可以表示为下面的形式: (-1)^S * M * 2^E。

(1)(-1)^S表示符号位,当S=0,V为整数;S=1,V为负数;

(2)M表示有效数字,大于等于1,小于2;

(3)2^E表示指数位。

        比如:5.0的二进制是101.0,相当于1.01 * 2^2,此时s=0,M=1.01,E=2。

(1)2位浮点数

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

(2)64位浮点数

          IEEE 754规定,对于64位浮点数,最高位是符号位s,接着的11位是指数E,剩下的52位为有效数字M。

        IEEE 754对有效数字M和指数E还存在一些特别的规定:

        因为1<=M<2,所以M可以写成1.xxx的形式,所以在计算机内部保存M时,默认这个数字第一位总是1,因此可以被舍去,只保存后面xxx小数部分;在读取时,再把第一位的1加上去,这样就能节省1位有效数字。以32位浮点数为例,留给M只有23位,将M的1舍去后,就可以保存24位有效数字。

3. 浮点数的取出

        首先指数E是一个无符号整数,也就是说若E为8位,它的取值范围为0-255;若E为11位,它的取值范围为0-2047。

        但是我们都知道,科学计数法中E是可以取负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,中间数是127;对于11位的E,中间数是1023。这样就能以正整数的形式来表示负数。

4. 浮点数的取出

4.1 E不全为0或不全为1

        指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位1.

例如:

        0.5的二进制形式为0.1,科学计数为1.0*2^(-),其阶码为-1 + 127 = 126,存入为01111110,尾数1.0去掉1后为0,补零到23位,存入为00000000000000000000000,所以其二进制形式为:0 011111110 00000000000000000000000。取出同理反向计算即可。

4.2 E全为0

        此时浮点数的指数E为1-127(或1-1023)即真实值。

        有效数字M不再加上第一位的1,而是还原为0.xxx的小数,目的是为了表示±0,以及接近于0的很小的数字。

4.3 E全为1

        此时有效数字M全为0,表示±无穷大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化漏洞挖掘方式

自动化漏洞挖掘方式 一、Goby安装使用1.1、goby简介1.2、goby下载安装1.3、简单扫描1.4、Goby插件 二、Xray安装使用2.1、XRAY简介2.2、Xray安装2.3、Xray使用2.4、爬虫模式&#xff08;主动扫描&#xff09;2.5、被动扫描2.6、BurpSuite联动Xray2.7、Rad联动Xray 一、Goby安装…

X、Y、Z轴上旋转角度的Eigen::Vector3d对象转换为一个旋转矩阵

#include <iostream> #include <Eigen/Core> #include <Eigen/Geometry>using namespace std; using namespace Eigen;

django框架中使用ORM设计数据库的模型

ORM关联数据的逻辑是&#xff1a; Django 中常见的模型字段类型及其含义&#xff1a; AutoField&#xff1a;一个自动递增的整型字段&#xff0c;添加记录时它会自动增长。BigAutoField&#xff1a;一个自动递增的 biginteger字段&#xff0c;添加记录时它会自动增长。CharFie…

数据结构之图

7 图的存储 &#xff08;1&#xff09;图的邻接矩阵存储 对于无向图&#xff0c;邻接矩阵第i行/列上非零元素个数是顶点vi的度。 对于有向图&#xff0c;邻接矩阵第i行上非零元素个数是顶点vi的出度&#xff0c;第i列 上非零元素个数是顶点vi的入度。 对于带权有向图有边则…

常见面试题之垃圾收回

1. 简述Java垃圾回收机制&#xff1f;&#xff08;GC是什么&#xff1f;为什么要GC&#xff1f;&#xff09; 为了让程序员更专注于代码的实现&#xff0c;而不用过多的考虑内存释放的问题&#xff0c;所以&#xff0c;在Java语言中&#xff0c;有了自动的垃圾回收机制&#x…

javaUDP数据报套接字编程

0.前言 对于UDP协议来说&#xff0c;具有无连接&#xff0c;面向数据报的特征&#xff0c;即每次都是没有建立连接&#xff0c;并且一次发送全部数 据报&#xff0c;一次接收全部的数据报。 java中使用UDP协议通信&#xff0c;主要基于 DatagramSocket 类来创建数据报套接字&a…

探索人工智能的奇妙世界:解密AI技术的未来发展

作为一名热爱技术的开发者&#xff0c;当谈到人工智能&#xff08;AI&#xff09;和焦虑商业化时&#xff0c;我总会面临一个困境&#xff1a;到底是愁眉苦脸&#xff0c;还是开怀大笑&#xff1f;让我带你走进这个有趣又争议的话题。 首先我们需要面对AI的自学能力。这些智能…

Django4.0+使用rest_framework_jwt的问题

问题描述 python版本&#xff1a;3.10 Django版本&#xff1a;4.1 djangorestframework-jwt版本&#xff1a;1.11.0 在写jwt认证功能时&#xff0c;发现run的时候会报以下错误 from django.utils.translation import ugettext as _ ImportError: cannot import name ugettext…

day69_Vue进阶

今日内容 零、 复习昨日 零、 复习昨日 nginx 静态服务器(动静分离)反向代理服务器(代理后端服务器)负载均衡异步 前端工程化 —> java代码工程 一、使用Vue-Cli搭建Vue项目 1.1 什么是vue-cli cli: Command Line 命令行工具&#xff0c;vue-cli就是vue的命令行工具&#xf…

ThreadPoolExecutor 线程池源码学习

ThreadPoolExecutor 线程池源码学习 1.阅读源码 1.ThreadPoolExecutor.execute public void execute(Runnable command) {if (command null)throw new NullPointerException();// ctl 高三位记录线程状态。低29位记录线程池中线程数int c ctl.get();//位运算获取工作线程数 …

wireshark抓包实践

目录 ifconfig ( network interfaces configuring )tcpdump 命令tcpdump&wireshark例子 ifconfig ( network interfaces configuring ) eth0表示网卡UP代表网卡开启状态RUNNING代表网卡的网线被接上mtu1500: MTU&#xff08;最大传输单元&#xff09;是指在网络中传输数据时…

【javaEE面试题(五)在JMM(Java Memory Model (Java 内存模型))下谈volatile的作用】

volatile的作用 JMM下volatile作用 volatile 能保证内存可见性 volatile 修饰的变量, 能够保证 “内存可见性”. 代码在写入 volatile 修饰的变量的时候 改变线程工作内存中volatile变量副本的值将改变后的副本的值从工作内存刷新到主内存 代码在读取 volatile 修饰的变量的时…

B067-基础环境-抽取Basegit

目录 抽取base抽取domain和querymapper接口抽取service抽取 Git优点&#xff1a;Git安装及操作Git Bash命令行操作图形化客户端TortoiseGit操作Git集成Idea操作idea会把workspace作为本地仓库gitee操作idea解决代码冲突 抽取base 抽取domain和query domain&#xff1a;所有实体…

Nodejs 依赖包的存放路径设置(按其他博客修改路径后,安装路径仍在C盘的解决办法)

Nodejs 依赖包的存放路径设置 使用命令npm root -g 查看依赖包的安装位置 默认依赖包的安装位置是在C盘。为了防止C盘存太多东西&#xff0c;我这里已经将安装位置改到了D盘&#xff0c;下面就记录下修改的步骤。 1. 创建新的依赖包安装目录 在 nodejs 的安装目录下创建两个新…

8年资深测试总结,性能测试+性能优化(详细)进军高级测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能优化常见概念…

LabVIEW FPGA利用响应式数字电子板快速开发空间应用程序

LabVIEW FPGA利用响应式数字电子板快速开发空间应用程序 与传统的基于文本的语言相比&#xff0c;LabVIEW的编程和设计已被证明可以缩短开发时间。各种研究表明&#xff0c;生产率的提高在3到10倍之间。LabVIEW通过图形语言、集成开发环境和多个编译器的组合来实现这一点。 图…

qt对话框

完善文本编辑器 #include "second.h" #include "ui_second.h"second::second(QWidget *parent) :QWidget(parent),ui(new Ui::second) {ui->setupUi(this);this->setWindowTitle("聊天室界面");//设置标题this->setWindowIcon(QIcon(&…

边缘检测

目录 1、边缘检测原理 2、Sobel算子边缘检测 3、Scharr算子边缘检测​编辑 4、算子生成函数 5、Scharr、Sobel的使用 6、Laplacian算子边缘检测 7、Canny算子边缘检测 8、Laplacian、Canny的使用 1、边缘检测原理 2、Sobel算子边缘检测 3、Scharr算子边缘检测 4、算子生成函…

MySQL数据库 - 表的操作

目录 一、创建表 二、创建表案例 1、显示当前使用的数据库名 2、创建表 2.1 MyISAM存储引擎表 2.2 InnoDB存储引擎表 三、查看表结构 四、修改表 1、新增列 2、修改列类型 3、修改列名 4、修改表名 5、删除列 五、删除表 表的操作至少会涉及如下两类SQL语句&…

adb日常使用命令

重启电脑adb服务 adb start-server和adb kill-server mac中uiautoviewer的位置 android-sdk→tools→bin→uiautomatorviewer.bat adb查看本机abi类型 adb shell getprop ro.product.cpu.abi github 比较好的adb教程&#xff1a; https://github.com/mzlogin/awesome-adb a…