数据在内存中的存储<C语言>

导言

        在计算机中不同类型的数据在计算机内部存储形式各不相同,弄懂各种数据在计算机内部存储形式是有必要的,C语言的学习不能浮于表面,更要锻炼我们的“内功”,将来在写程序的时候遇见各种稀奇古怪的bug时,也便能迎刃而解,所以本文将着重介绍,整数在内存中的存储、大小端字节序和判断、浮点数的存储。


整数在内存中的存储

       这部分的内容在前面已经讲过,现在让我们来复习一下:

一个数的二进制表示方法有三种:原码、反码、补码

        原码:直接将数转为2进制序列,得到的就是原码

        反码:符号位不变,将其它位取反

        补码:在反码基础上+1

在C语言中整数可分为有符号整数和无符号整数

        有符号整数:有符号位(第一位),0为正、1为负

        有符号整数:没有符号位,即全为正数。

在计算机内部存放的是补码,为啥是补码?

        因为CPU只有加法器,在计算机内部,正数的补码是本身,负数补码符号位不变,其他位取反,存放补码可实现加减法的统一运算(不需要添加减法器):

//在计算机内部存放的是补码,为啥是补码?
int main() {int a = 9;//a的补码:00000000 00000000 00000000 00001001int b = 4;//b的补码:00000000 00000000 00000000 00000100int c = a - b;//c=a-b会被转化为c=a+(-b)// a的补码:00000000 00000000 00000000 00001001//-b的补码:11111111 11111111 11111111 11111100// c的补码 100000000 00000000 00000000 00000101//相加结果多出一位,int型只有4字节、32位,高位抛弃// c的补码: 00000000 00000000 00000000 00000101//正数原反补相同,10进制数为5printf("%d", c);return 0;
}

运行结果:


 大小端字节序和判断

        超过一个字节的数据在存储时就会有存储顺序的问题:

         通过调试观察一个整型在内存中的存储可知:a的低位存储在低地址处,当前平台属于小端存储模式。

大端存储模式:

        是指数据的低位字节存储在内存空间的高位地址处。(大对大)

小端存储模式:

        是指数据的低位字节存储在内存空间的低位地址处。(小对小)

为了更好的理解下面给出几道练习:

        练习1(百度笔试10分)

简述大端字节序和小端字节序的概念,设计一个程序来判断当前机器的字节序。

        

         练习2

以下代码输出结果是啥?

#include <stdio.h>
//X86环境 ⼩端字节序 
int main()
{int a[4] = { 1, 2, 3, 4 };int* ptr1 = (int*)(&a + 1);int* ptr2 = (int*)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2);return 0;
}

运行结果:

 分析一下:

#include <stdio.h>
//X86环境 ⼩端字节序 
int main()
{int a[4] = { 1, 2, 3, 4 };int* ptr1 = (int*)(&a + 1);//&a取出整个整个数组的地址(访问权限为4*sizeof(int)个字节),再加1到元素4的后面int* ptr2 = (int*)((int)a + 1);//(int)a:将地址转为int类型的数,并加1,就是加了一个字节//因为当前平台为小端字节序,加1跳过了01,并从第二个字节开始00 00 00 02printf("%x,%x", ptr1[-1], *ptr2);//ptr[-1],访问权限为int型,倒退4字节,来到4的起始地址并打印//*ptr2:00 00 00 02,因为平台为小端字节序,所以该数为2000000return 0;
}

浮点数的存储

        浮点数的存储是比较特殊的,因为它具有小数位,如果采用整数存储方法肯定是不行的,于是IEEE(国际电气和电子工程协会)754规定,任意一个浮点数V可以表示为下面这种形式:

●-1的S次方:符号位,S为1时负数,S为0时正数

●M:有效数字,M大于1小于2

●E:指数位

如10进制数5.5转为二进制数101.1

那么S=1

        M=1.011

        E=2

浮点数在存储时就是存储的SME,值得注意的是,常见浮点数float和double型的字节长度是不一样的,那么在存储时,SME的内存分配会有所不同:

 

注意点:

●前⾯说过, 1≤M,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表⽰⼩数部分。 因此1.可以舍去

●指数E,E为一个无符号整数,为了能存负数,754规定:存入内存时E的真实值必须再加上一个中间数,float:127,double:1023

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

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

相关文章

天文学专业大学院校排名(2024最新排行榜)

序号 学校代码 学校名称 学科名称 评估结果 1 10284 南京大学 天文学 A 2 10358 中国科学技术大学 天文学 A 3 10001 北京大学 天文学 B- 4 10248 上海交通大学 天文学 C 5 10027 北京师范大学 天文学 C- 天文学专业排名前5名的大学有&#xff1…

pipeline在计算机领域有什么贴切的翻译

在计算机领域&#xff0c;"pipeline"一词通常被翻译为“流水线”。这个术语指的是一种技术或架构&#xff0c;其中多个处理阶段按顺序执行&#xff0c;使得数据可以在一个阶段完成处理后立即被送入下一个阶段&#xff0c;从而提高效率和性能。在不同的上下文中&#…

控制障碍函数CBF详解(附带案例实现)

控制障碍函数CBF详解&#xff08;附带案例实现&#xff09; 文章目录 控制障碍函数CBF详解&#xff08;附带案例实现&#xff09;1. Control Affine System2. Lyapunov Theory, Nagumos Theory, Invariance Principle3. Control Lyapunov Function (CLF) and CLF-QP4. Control …

算法(十二)分治算法

文章目录 算法概念算法例子字符串中小写转大写求X^n问题 算法概念 分治算法&#xff08;divide and conquer&#xff09;算法的核心思想其实就是"分而治之"&#xff0c;将原问题划分成n个规模较小&#xff0c;并且结构与原问题相似的子问题&#xff0c;递归地解决这…

移植其他命令行Vivado IDE的工具

移植其他命令行Vivado IDE的工具 介绍 本章介绍如何迁移各种AMD命令行工具以在AMD中使用 Vivado™集成设计环境&#xff08;IDE&#xff09;。 迁移ISE Partgen命令行工具 ISE™Design Suite Partgen工具可获得&#xff1a; •系统上安装的所有设备的信息 •详细的包装信息 您可…

[openwrt-21.02]openwrt-21.02 make menuconfig不显示luci-app-firewall问题分析及解决方案

问题描述 make menuconfig在 在applications界面没有luci-app-firewall 问题分析 首先重新执行 ./scripts/feeds update -a ./scripts/feeds install -a 然后再次执行make menuconfig&#xff0c;依然不显示&#xff0c;所以不是feeds安装的问题 最后看到log有个openmptc…

GB-T 43206-2023 信息安全技术 信息系统密码应用测评要求

GB-T 43206-2023 信息安全技术 信息系统密码应用测评要求 编写背景 随着信息技术的飞速发展&#xff0c;信息系统在社会经济活动中扮演着越来越重要的角色。信息安全问题也随之成为社会关注的焦点。GB-T 43206-2023《信息安全技术 信息系统密码应用测评要求》是针对信息系统中…

kotlin gradle 在libs.versions.toml控制下添加本地aar/jar的方法

与之前gradle集中控制的方法相同&#xff0c;唯一不同的是改成kotlin dsl格式&#xff1a; 修改Module级别的build.gradle.kt文件 在dependencies函数块内添加下面代码块 implementation(fileTree(mapOf("dir" to "libs","include" to listOf(…

记录mabatis-plus初体验

一、简介 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 测试问题现象&#xff1a;测试mabatis的crud方法 增加 批量删除都没有问题 单单就是这个根据ID删除有问题 解决方案&#xff1a;真的就是pom文件的问题 自己的版本是Intelli…

Fully Convolutional Networks for Semantic Segmentation--论文笔记

论文笔记 资料 1.代码地址 2.论文地址 https://arxiv.org/abs/1411.4038 3.数据集地址 论文摘要的翻译 卷积网络是强大的视觉模型&#xff0c;可以产生特征层次结构。我们表明&#xff0c;卷积网络本身&#xff0c;经过端到端&#xff0c;像素对像素的训练&#xff0c;在…

【新能源大巴BMS结构与乘用车的区别】

新能源大巴BMS结构与乘用车的区别 这篇文章主要介绍新能源大巴的电池和BMS的结构与乘用车的区别。 主要有&#xff0c;新能源大巴行业、新能源电池系统结构和新能源大巴的BMS系统。 第一部分 新能源大巴行业 其实数数全球的商用车(大巴卡车)&#xff0c;大致的方向还是沿着就…

解释 Vue route和router的区别?

Vue中的route和router在单页应用&#xff08;SPA&#xff09;开发中扮演着不同的角色&#xff0c;它们的区别可以归纳为以下几点&#xff1a; 定义与功能&#xff1a; router&#xff1a;router是Vue Router的一个实例对象&#xff0c;它是全局的。通过Vue.use(VueRouter)和Vue…

RocketMQ重复消费的幂等性问题

什么是幂等性&#xff1f;----》多次调用接口&#xff0c;得到的结果都一样。 用幂等性来解决重复消费的问题。 重复消费可以解决吗-----》重复消费根部避免不了。只能从消息的幂等消费入手。 为什么会有重复消费&#xff1f; 由于我们要求RocketMQ消息不丢失&#xff0c;要…

前端传String字符串 后端使用enun枚举类出现错误

情况 前端 String 后端 enum 前端 后端 报错 2024-05-31T21:47:40.61808:00 WARN 21360 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to con…

多态的一些问题

&#x1f3f7;️ 问答题&#xff1a; 1. 什么是多态&#xff1f; 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要概念&#xff0c;指的是同一操作作用于不同对象时&#xff0c;可以表现出不同的行为方式。多态性允许不同类型的对象以统一的接口进行操作…

tomlkit mypy error: Value of type “Item | Container“ is not indexable [index]

使用tomlkit进行TOML文件的读写时&#xff0c;mypy静态检查报错如下&#xff1a; demo.py:5: error: Value of type "Item | Container" is not indexable [index]poetry_conf doc[tool][poetry]^~~~~~~~~~~~~~~~~~~~~ demo.py:7: error: Unsupported target for …

香港服务器无法访问是什么情况?

香港服务器无法访问是什么情况?简单来说&#xff0c;这意味着香港服务器没有响应请求&#xff0c;客户端无法访问。此错误可能由于多种原因而发生&#xff0c;包括网络连接问题、服务器停机、防火墙限制和 DNS 错误。当发生服务器无法访问错误时&#xff0c;它会影响您网站的性…

OncePerRequestFilter 和 GenericFilterBean比较

OncePerRequestFilter 和 GenericFilterBean 都是Spring框架提供的用于构建自定义Servlet过滤器&#xff08;Filter&#xff09;的基类&#xff0c;它们主要用于处理Web请求的拦截和处理逻辑。以下是它们各自的详细说明&#xff1a; GenericFilterBean 类描述&#xff1a;Gen…

Qt for android : libusb在android中使用

简介 如何在Qt for Android中使用libusb&#xff0c; 其实libusb的文档里面都写的很清楚&#xff0c; 这里只是稍微做下整理。 libusb libusb github源码 libusb release的版本, 有编译好的静态 步骤 1. 下载libusb libusb v1.0.027 源码包 2. 整理提取libusb android使用源…

Docker 私有仓库部署和管理

目录 一、案例一 概述 二、案例一 前置知识点 2.1、什么是 Docker Compose 2.2、什么是 Consul 三、案例一 使用 docker Compose 搭建 Consul 集群环境 3.1、案例实验环境 3.2、案例需求 四、案例实施 4.1、Docker 网络通信 1&#xff09;端口映射 2&#xf…