首页 > 系统相关 >【C语言进阶】--- 数据在内存中的存储方式

【C语言进阶】--- 数据在内存中的存储方式

时间:2024-05-29 22:32:03浏览次数:25  
标签:存储 字节 int double C语言 --- 地址 整型 进阶

整型的存储方式

整型的分类

整型大致分为:char、short、int
char:字符型, 占1个字节的空间
short:短整型,占2个字节的空间
int: 整型, 占4个字节的空间

存储方式

这里声明,借用我在讲【C语言】— 操作符中的部分内容
整数的二进制表示形式:原码、反码、补码

  • 正整数的原码、反码、补码是相同的
  • 负的整数是要计算的
  • 一个int整型变量所占4个字节,因此就是32个比特位,一个比特位就是一个二进制位,因此32个二进制位存储该数据 如下:
    在这里插入图片描述
    整数在内存中是用补码进行存储的,也是用补码进行计算的

接下来讨论内存中的数据与地址大小的关系

首先,从整体来看,数据是由高地址向低地址存放的
一个地址管理一个字节的内存,而像 int 这样的整型创建的变量占4个字节,就需要4个地址来管理
我们平时所说的变量的地址,实际上是这4个地址的首地址,也就是4个地址中最低的那个地址
如下图,两种存储顺序
在这里插入图片描述
像这样的存储顺序叫做字节序:是以字节为单位,讨论存储顺序的

  • 小端字节序存储:
    • 把一个数据的低位字节的内容,存放在低地址
    • 把一个数据的高位字节的内容,存放在高地址
  • 大端字节序存储:
    • 把一个数据的低位字节的内容,存放在高地址
    • 把一个数据的高位字节的内容,存放在低地址

计算机是按照小段字节序存储的。

写一个函数,判断当前机器用大端字节序存储还是小端

int main()
{
	因为char*类型的指针只能访问一个字节的内容
	如果是小端,那么访问到的值就是44,如果是大端,就是11
	这里注意,存放的是十六进制数,打印的时候要用%x
	
	int n = 0x11223344;
	char* p = &n;
	printf("%x", *p);
	
	return 0;
}

浮点型的存储方式

浮点型有哪些类型?

float、double、unsigned float、unsigned double

  • float与double都是有符号的类型(有正负)
  • 剩余两个是无符号型(非负数)

float ------------------------ 4个字节
unsigned float ----------- 4个字节
double --------------------- 8个字节
unsigned double -------- 8个字节

在系统中的存储方式

浮点数都可以表示为:V = (-1)S * M * 2E
解释:

  • 若S == 0,V是正数;若S == 1,V是负数
  • M是一个>=1且<2的数
  • 2E表示整数位
  • E,小数点向左移动E位(E可以使负数)
    举个例子:

十进制数:5.5
转换为二进制:101.1

  • 1*22 + 0*21 + 1*20 + 1*2-1 == 5.5
  • 101.1可以用 (-1)0 * 1.011 * 22表示 S==0,M == 1.011,E == 2
  • 这里的M和E实际用的是科学计数法表示一个二进制数
  • E的值 == 2,表示的是二进制数的小数点向左移E位
  • M是一个大于等于1小于2的数,因此保存M的值是可以不保存这个1,系统默认有这个1,因此可以节省一个bit的空间存放其他值
  • 既然用S、M、E就可以表示一个浮点数,那么系统只需存储这3个值即可
  • 下面是浮点型在内存中的存储方式

在这里插入图片描述

标签:存储,字节,int,double,C语言,---,地址,整型,进阶
From: https://blog.csdn.net/weixin_59005084/article/details/139304633

相关文章

  • C语言实现排序之冒泡排序算法
    1.代码#include<stdlib.h>#include<stdio.h>#include<time.h>//函数声明//创建并生成一个包含随机数的数组,数组大小由参数size指定int*create_and_generate_random_array(intsize);//打印数组内容,参数array是数组指针,size是数组大小voidprint_array(int*arr......
  • C语言实现排序之选择排序算法
    1.代码#include<stdlib.h>#include<stdio.h>#include<time.h>//函数声明int*create_and_generate_random_array(intsize);voidprint_array(int*array,intsize);voidselection_sort(int*array,intsize);intgenerate_random_size();intm......
  • C语言学习——程序中的辅助语句,C语言中的常量
    目录一、程序中的辅助语句1.C语言中的注释2.赋值语句3.三目运算符4.逗号表达式5.自增(++)与自减(--)运算符6.goto语句二、C语言中的常量1.程序中常量的概念2.C语言中的常量类型3.常量定义的语法4.C语言中的只读变量 一、程序中的辅助语句1.C语言中的注释—注释......
  • 蓝桥杯-AB路线(详细原创)
    问题描述:有一个由N×M个方格组成的迷宫,每个方格写有一个字母A或者B。小蓝站在迷宫左上角的方格,目标是走到右下角的方格。他每一步可以移动到上下左右相邻的方格去。由于特殊的原因,小蓝的路线必须先走K个A格子、再走K个B格子、再走K个A格子、再走K个B格子......
  • python基础 - 模块与包
    模块与包import包名.模块名importdemo.demo#前缀比较长,一般推荐from包名import模块名demo.demo.fun1(2)fromdemoimportdemodemo.fun1(3)fromdemo.demoimportfun1fun1(4)标准路径标准路径>当前路径>项目路径>其他标准路径importsysforoneinsy.path:pr......
  • 数学建模--LaTex插入表格详细介绍
    目录1.插入普通的边线表格3.三线表的插入和空格说明3.基于复杂情况下表格的插入1.插入普通的边线表格(1)像这个右边的生成的这个比较普通的表格,我们是使用下面的代码实现的:(2)和插入一个一个图片一样,这个表格的插入也要构建一个环境,这个环境就是在这个\begin的后面加上{t......
  • 翻译《The Old New Thing》- Consequences of the scheduling algorithm: Low priorit
    Consequencesoftheschedulingalgorithm:Lowprioritythreadscantake100%CPU-TheOldNewThing(microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071220-00/?p=24093 RaymondChen 2007年12月20日调度算法的控制:低优先级线程也可能占用100%的......
  • DVWA-SQL Injection (Blind)
    SQL盲注的两种主要形式是基于布尔的盲注和基于时间的盲注,本篇主要记录盲注的知识,基础知识可以参考DVWA-SQLInjectionLow首先进行注入点测试,此处是字符型注入布尔盲注攻击者通过注入条件语句,利用应用程序中基于布尔条件的判断来获取有关数据库内容的信息。攻击者可以尝......
  • Linux-防火墙
    1.防火墙种类硬件:整个企业入口三层路由:H3C华为Cisco(思科)防火墙:深信服,绿盟,奇安信.....Juniper软件:开源软件网站内部封ip封ipiptables写入到Linux内核中,以后服务docker工作在4层(大部分)firewalldC7nftalbesC8ufw(ubuntufirewall)Ubuntu云......
  • at-rule or selector expectedcss(css-ruleorselectorexpected)
    问题如图所示,在使用scss和less是使用//注释就会出现红色报错,这个不影响运行,但是看着很不舒服。解决没有找到什么好的解决办法,一般的解决方法是,把验证关闭,然后重启。但是后面我开启这个设置,再进行注释,没有报错,感觉还是重启的作用。先放着不管吧。......