【张三学C语言之】—深入理解数据存储

【张三学C语言之】—深入理解数据存储

一,数据类型

不同的数据类型代表了不同数据在内存中开辟的空间大小 
 eg:int 在内存中占4个字节
整 型内容 注意:括号中的内容为每种类型所占的字节数
数据类型char(1字节) short(2字节) int(4字节) long(8字节)
浮点型float (8字节) double(16字节)
构造类型数组类型 (内存大小自己开辟决定) 结构体 struct (遵守内存对齐) 枚举 enum(内存元素决定) 联合类型 union(最大的那个元素的)
指针类型void 表示类型,通常用于函数的返回类型,函数的参数,指针类型
C语言没有字符串类型,所以用数组来存放字符串  eg:char[10]="abcdef"

二.整型数据在内存中的存储

1.源码,反码,补码

计算机中的符号已二进制的形式在内存中存储
数据在内存中已补码的形式存储
首位为符号位,其余位为数据位
0为正,1为负

源码:直接二进制按照正负数的形式翻译二进制即可

反码:符号位不变,数据位置取反

补码:反码+1

正数:源码=反码=补码

负数:以补码形式存储

eg:
正数
date:10
bin:00000000 00000000 00000000 00001010
源码=反码=补码=00000000 00000000 00000000 00001010
负数
date:-10
bin: 10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101
补码:11111111 11111111 11111111 11110110

2.数据在内存中已补码的形式存储的原因

a.使用补码可以将符号位和数据域统一处理

b.CPU只有加法器,使用补码可以使加法和减法统一处理

3,数据存储

字节序:

概念:cpu对内存中的数据以字节为单位进行存取的顺序

因为内存的有高低地址之分,数据的二进制有高低位之分

主机字节序主要取决于cpu架构: X86-小端; MIPS-大端
字节序主要是在网络通信时,不同主机之间的通信,如果字节序不同会造成数据二义

分类:int=0x11223344

大端存储:低地址存高位 内存中的存放11 22 33 44

小端存储:低地址存低位 内存中的存放44 33 22 11

👉注:大小端在面试和考试中是高频考点,想要了解更多点击下方链接了解。

http://t.csdn.cn/q270n

三.浮点型数据在内存中的存储

1,IEEE754 标准文档规定,任意一个浮点数在内存中的表示分三部分

符号单精度浮点数每一位所占内存双精度浮点数每一位所占内存
s—符号位1个比特位1个比特位
E—指数位8个比特位11个比特位
M—尾数23个比特位52个比特位

浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。

数符占 1 位二进制,表示数的正负。0表示正,1表示负

指数符占 1 位二进制,表示指数的正负。

尾数表示浮点数有效数字,0.xxxxxxx, 但不存开头的 0 和点。

指数存指数的有效数字。

指数占多少位,尾数占多少位,由计算机系统决定。

在这里插入图片描述

两种特殊情况:

E为全0:这时候真实指数值是1-127=-126,M表示真实值,通常用于表示正负0

E为全1:这时候真实指数值是255-127=128,M为全0时表示正负无穷大

2.取值范围

类型比特数有效数字数值范围
float326-7-3.410(-38)~3.410(38)
double6415-16-1.710(-308)~1.710(308)
long double12818-19-1.210(-4932)~1.210(4932)

如果存储比精度更重要,请考虑对浮点变量使用 float 类型。相反,如果精度是最重要的条件,则使用 double 类型。

浮点变量可以提升为更大基数的类型(从 float 类型到 double 类型)。当您对浮点变量执行算术时,通常会出现提升。此算术始终以与具有最高精度的变量一样高的精度执行。

float f_short;
double f_long;
long double f_longer;
gf_short = f_short * f_long

在前面的示例中,变量f_short提升到类型 double 并且与f_long相乘;然后,结果舍入到类型 float,然后赋给f_short。

3.应用示例分析

在 C 和 C++ 中,如下赋值语句:

float  a=0.1; 

编译器报错:warning C4305: ‘initializing’ : truncation from 'const double ’ to 'float ’

原因:在 C/C++ 中,上述语句等号右边 0.1,认为是个 float,但是编译器却把它认为是个 double(因为小数默认是 double),所以要报这个 warning,一般改成0.1f就没事了。

欢迎各位来交流,如果觉得有用的话,记得评论+收藏+关注哦!喵~~

今日垃圾话:长大之后才明白,世上无难事,只怕有心人。

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值