C语言—数据在内存中的存储

1.整数在内存中的存储

文章回顾(C语言—操作符详解)

整数的2进制表示方式有三种,即原码、反码和补码。

有符号的整数,三种表示方式均有符号位数值位两部分,符号位都是用0表示“正”,用1表示“负”,最高位的一位是被当做符号位,剩余都是数值位。

正整数的原、反、补码都相同。

负整数的三种表示方法各不相同。

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

反码:将原码的符号位不变,其他位次按位取反。

补码:反码+1。

对于整型来说:数据存放内存中,其实存放的是二进制的补码。

因为在计算机系统中,数值一律用补码来表示和存储。使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

2.大小端字节序和字节序判断

#include <stdio.h>

int main()
{
    int a = 0x11223344;
    return 0;
}

可以发现:在内存管理中,是倒着存储的。

2.1 大小端

其实超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储。

大端(存储)模式:数据的低位字节内容保存在内存的高地址处,而数据的高位字节内存,保存在内存的低地址处。

小端(存储)模式:数据的低位字节内存保存在内存的低地址处,而数据的高位字节内存,保存在内存的高地址处。

2.2 为什么有大小端

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

#include <stdio.h>
#include <string.h>

int check_sys()
{
    int a = 1;
    if (*(char*)&a == 1)
    {
        return 1;//小端
    }
    else
    {
        return 0;//大端
    }
}

int main()
{
    if (check_sys() == 1)
    {
        printf("小端");
    }
    else
    {
        printf("大端");
    }
    return 0;
}

练习1:

#include <stdio.h>
#include <string.h>

int main()
{
    
    //10000000 00000000 00000000 00000001
    //11111111 11111111 11111111 11111110
    //11111111 11111111 11111111 11111111

    char a = -1;//11111111——>整型提升11111111 11111111 11111111 11111111
                //                     10000000 00000000 00000000 00000000
                //                     10000000 00000000 00000000 00000001

    signed char b = -1;



    unsigned char c = -1;//11111111——>整型提升00000000 00000000 00000000 11111111


    printf("a=%d,b=%d,c=%d", a, b, c);
    //                      -1  -1 255
     
    return 0;
}

练习2:

#include <stdio.h>

int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));

	return 0;
}

输出:255

练习3:

#include <stdio.h>

unsigned char i = 0;

//  0-255

int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
	return 0;
}

死循环

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

常见的浮点数:3.14159、1E10等,浮点数家族包括:float、double、long double 类型。

浮点数表示的范围:float.h  中定义。

3.1 浮点数的存储

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:

  • V=(-1)的S次方  *  M  *  2的E次方
  • (-1)的S次方表示符号位,当S=0时,V为正数;当S=1,V为负数。
  • M表示有效数字,1<=M<2
  • 2的E次方表示指数位

10进制的5.5。在二进制中就是(-1)的0次方 * 1.011 * 2 的2次方。

对于32位的浮点数(float),最高的1位存储的是S,接着的8位存储指数E,剩下的23 存储M

对于64位的浮点数(double),最高的1位存储的是S,接着的11位存储指数E,剩下的52位存储M

3.1.1 浮点数存的过程

IEEE 754 对有效数字M和指数E,还有一些特别规定。

M的存储方式:

前面说过,1<=M<2,也就是说,M可以写成1.xxxxxxx的形式。

同时,IEEE 754 也规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被省去,

只保存后面的xxxxx(小数部分)。

E的存储方式:

关于指数E,首先E是一个无符号整数(unsigned int)。

这意味着,如果E是8位的,它的取值范围是0 - 255 ;如果E是11位的,它的取值范围是0 - 2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时,E的真实值必须再加上一个中间数。对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023,。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10 + 127 ,即10001001。

3.1.2 浮点数取的情况

情况1:E有0有1

这时,浮点数就采用下面的规则表示,即指数E的计算值减去127,得到真实值,再将有效数组M前加上第一位的1。

比如:0.5的二进制形式为0.1,由于规定了有效数字的范围,所以就变成了:(-1)^0 * 1.0 * 2^(-1)。

最后就是:0    01111110    00000000000000000000000

情况2:E全为0

说明指数真实值其实是1-127次方或者1-1023次方(这是一个死规定),而且前面那个整数1也不要了。那么这个数肯定就是一个很接近0的数字。

情况3:E全为1

说明指数真实值其实是128,说明这个数其实是一个很大很大的数字。

作者自述:本文主要针对数据在内存中的存储形式的知识。内容中包含了很多总结内容。本文制作不易,求求动动你们发财的小手点个赞和关注,这是对我创造最大的动力。后续我也会跟进内容,尽量一周至少一次,保证内容的质量。如果有想知道的内容或者有建议的地方,欢迎后台私信或者在本文留言哦。感谢各位的支持捏Thanks♪(・ω・)ノ。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Salesforce‘s 爱因斯坦机器人助手引领工业聊天机器人时代

CRM的对话式人工智能助手&#xff0c;根据公司数据提供可靠的人工智能响应及日本工业聊天机器人现状 【前言】 爱因斯坦助手&#xff08;Einstein Copilot&#xff09;提供可靠的响应&#xff0c;因为它基于公司独特的数据和元数据&#xff0c;使其能够深入了解公司的业务和客…

Flutter- AutomaticKeepAliveClientMixin 实现Widget保持活跃状态

前言 在 Flutter 中&#xff0c;AutomaticKeepAliveClientMixin 是一个 mixin&#xff0c;用于给 State 类添加能力&#xff0c;使得当它的内容滚动出屏幕时仍能保持其状态&#xff0c;这对于 TabBarView 或者滚动列表中使用 PageView 时非常有用&#xff0c;因为这些情况下你…

-------------------------面试散文-----------------------------------

问题1&#xff1a;vue中动态引入图片&#xff0c;为什么使用require&#xff1f; 回答&#xff1a;因为动态添加的src 编译过后的文件地址和被编译过后的资源文件地址不一致&#xff0c;从而导致无法访问题 而使用require 返回的就是资源文件被编译后的文件地址&#xff0c;从…

[大模型]MiniCPM-2B-chat Lora Full 微调

MiniCPM-2B-chat 介绍 MiniCPM 是面壁智能与清华大学自然语言处理实验室共同开源的系列端侧大模型&#xff0c;主体语言模型 MiniCPM-2B 仅有 24亿&#xff08;2.4B&#xff09;的非词嵌入参数量。 经过 SFT 后&#xff0c;MiniCPM 在公开综合性评测集上&#xff0c;MiniCPM …

鸿蒙开发文件管理:【@ohos.securityLabel (数据标签)】

数据标签 该模块提供文件数据安全等级的相关功能&#xff1a;向应用程序提供查询、设置文件数据安全等级的JS接口。 说明&#xff1a; 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import security…

pycharm终端pip安装模块成功但还是显示找不到 ModuleNotFoundError: No module named

报错信息&#xff1a; ModuleNotFoundError: No module named 但是分明已经安装过此模块&#xff1a; 在cmd运行pip list 查看所有安装过的包找到了安装过&#xff1a; 如果重新安装就是这样&#xff1a;显示已经存在了 问题排查&#xff1a; 直接根据重新安装的显示已存在的…

用 KV 缓存量化解锁长文本生成

很高兴和大家分享 Hugging Face 的一项新功能: KV 缓存量化 &#xff0c;它能够把你的语言模型的速度提升到一个新水平。 太长不看版: KV 缓存量化可在最小化对生成质量的影响的条件下&#xff0c;减少 LLM 在长文本生成场景下的内存使用量&#xff0c;从而在内存效率和生成速度…

禁渔期水域监管:EasyCVR视频智能监控方案

一、背景与需求分析 根据农业部印发的《中国渔政亮剑2024系列专项执法行动方案》&#xff0c;我国将持续推进长江十年禁渔、海洋伏季休渔、黄河等内陆重点水域禁渔等专项行动。根据四川省相关规定&#xff0c;每年3月1日至6月30日为禁渔期&#xff0c;在此期间&#xff0c;四川…

C语言 | Leetcode C语言题解之第148题排序链表

题目&#xff1a; 题解&#xff1a; struct ListNode* merge(struct ListNode* head1, struct ListNode* head2) {struct ListNode* dummyHead malloc(sizeof(struct ListNode));dummyHead->val 0;struct ListNode *temp dummyHead, *temp1 head1, *temp2 head2;while…

等级考试3-2021年12月题目

十二月&#xff1a; #include <iostream> using namespace std; int sum(int); int main(){int n;cin>>n;for(int i1;i<100000;i){for(int j1;j<i;j){if(sum(i)-j*2n){cout<<j<< <<i;return 0; }}}return 0; } int sum(int n){int sum0;fo…

大数据学习——linux操作系统(Centos)安装mysql(Hive的元数据库)

一. 准备工作 1. 打开虚拟机并连接shell工具 2. 将mysql安装包上传至虚拟机 mysql安装包 提取码&#xff1a;6666 将下载好的jar包拖至install_package目录下 3. 检查环境 rpm -qa|grep mariadb 如果上述命令返回有结果 那么进行mariadb的卸载 rpm -e --nodeps mariadb-l…

【前端项目笔记】1 登录与登出功能实现

项目笔记 ☆☆代表面试常见题 前后端分离&#xff1a;后端负责写接口&#xff0c;前端负责调接口。 登录/退出功能 登录业务流程 登录页面&#xff1a;用户名密码 调用后台接口进行验证 通过验证&#xff0c;根据后台响应状态跳到项目主页 登录业务相关技术点&#xff1…

计算机网络 —— 运输层(四次挥手)

计算机网络 —— 运输层&#xff08;四次挥手&#xff09; 四次挥手客户端到服务器的关闭第一次挥手第二次挥手 服务器到客户端连接的关闭第三次挥手第四次挥手 等待时间的必要性 我们今天来看TCP协议的四次挥手&#xff1a; 四次挥手 TCP的四次挥手&#xff08;Four-Way Han…

BigDecimal-解决java中的浮点运算

《阿里巴巴 Java 开发手册》中提到&#xff1a;“为了避免精度丢失&#xff0c;可以使用 BigDecimal 来进行浮点数的运算”。浮点数的运算竟然还会有精度丢失的风险吗&#xff1f;确实会&#xff01; 示例代码&#xff1a; float a 2.0f - 1.9f; float b 1.8f - 1.7f; Syst…

【沟通管理】项目经理《葵花宝典》之跨部门沟通

为什么每次跟其它部门的沟通总是不欢而散&#xff1f; 为什么每次想好好的就事论事的时候&#xff0c;却总是像在吵架&#xff1f; 为什么沟通总是不同频&#xff1f; 这是不是你作为项目经理在跨部门沟通时经常会遇到的问题&#xff1f; 在企业项目管理中&#xff0c;跨部门沟…

【SpringCloud学习笔记】RabbitMQ(上)

1. RabbitMQ简介 官网地址&#xff1a;https://www.rabbitmq.com/ 2. 安装方式 安装前置准备&#xff1a; 此处基于Linux平台 Docker进行安装&#xff0c;前置准备如下&#xff1a; Linux云服务器 / 虚拟机Docker环境 安装命令&#xff1a; docker run \-e RABBITMQ_DEFAU…

ControlNet作者新作Omost 一句话将LLM的编码能力转化为图像生成能力,秒变构图小作文,再也不用为不会写提示词担心了!

近日&#xff0c;ControlNet的作者推出了一个全新的项目—Omost。Omost是一个将LLM的编码能力转化为图像生成能力的项目。对现有图像模型的提示词理解有着巨大的帮助。通过很短的提示词&#xff0c;就可以生成非常详细并且空间表现很准确的图片。 完美解决新手小白不会写提示词…

数据结构01 栈及其相关问题讲解

栈是一种线性数据结构&#xff0c;栈的特征是数据的插入和删除只能通过一端来实现&#xff0c;这一端称为“栈顶”&#xff0c;相应的另一端称为“栈底”。 栈及其特点 用一个简单的例子来说&#xff0c;栈就像一个放乒乓球的圆筒&#xff0c;底部是封住的&#xff0c;如果你想…

QField测量功能

QField提供开箱即用的测量功能&#xff0c;可以灵活更改工程中测量距离和面积的单位。您可以在 "常规" 部分导航到 "工程" 菜单&#xff0c;并选择 "工程属性..." 完成此操作。 要启用测量工具&#xff0c;请打开主菜单并选择 测量工具 。 启…

JS 描述二叉树(含二叉树的前、中、后序遍历)

JS 对象描述二叉树 const binaryTreeNode {value: A,left: {value: B,left: {value: C,right: {value: G}},right: {value: D}},right: {value: E,left: {value: F,left: { value: H },right: { value: L }}} }前、中、后序遍历结果 前序遍历&#xff08;中在前&#xff09;&a…