国内十大网站建设公司,wordpress是是什么技术,wordpress打不开首页,关键词怎么提取首先明确一个概念#xff1a;C语言中整形是按照二进制存储在内存中#xff0c;浮点型是按科学计数法存储在内存中#xff08;本质上存储的还是二进制数据0和1#xff09;。
如果没看懂这句话#xff0c;没关系#xff01;看完以下正文#xff0c;你就会豁然开朗#x…首先明确一个概念C语言中整形是按照二进制存储在内存中浮点型是按科学计数法存储在内存中本质上存储的还是二进制数据0和1。
如果没看懂这句话没关系看完以下正文你就会豁然开朗并且预先提出两个问题
1为什么浮点型不能执行位运算
2浮点型数据转换为整形数据时编译器内部做了什么样的处理
接下来讲解C语言中浮点型数存储的规则
c语言中的浮点型有如下几种 float double longdouble因为不同系统平台下数据类型的长度会不一样这里我们统一在32位GCC编译器下 float4Bytedouble8个Byte
先定义
float num_110.5f; /* 这里有个小知识点很多编译器中如果10.5后面不加f小写,会默认为存储为double类型*/
double num_2 11.5 根据国际电器和电子工程协会标准IEEE754规定浮点数可以按照以下规则存储
-1^S*M*2^E
可以将上述公式分为两部分来看-1^S是确定数字是整数还是负数。M*2^E确定的数字绝对值的大小。
这里的M必须是二进制数。
S必须是整数1或整数0
E也必须是0的整数
结合图形来看 C语言存储浮点型数据float时会将内存分为三个区域。结合实例我们来看
float num_110.5先转换为IEEE754格式首先该数为正数故s0-1^00,符号位0表示正数。
第1步在把10.5转换为科学计数法 1.05*10^1
第2步再把10.5二进制格式其中M要为二进制数据dec10.5bin1010.1
第3步二进制写成科学计数法10.51010.1*2^0 1.0101*2^3。
10.5为正数于是 31符号位0、E3 0000 0011 。有效数字M1.0101。但是如果你按上述来写肯定是错误的。浮点数存储时还要遵守一定的转换方式转换规则如下也是很重要的一个知识点
规则11M2。IEEE 754规定 M只存储小数部分于是10.5只会存储0101,系统会默认最高位为1。
规则2而E存储时:
float类型数据存储值E127.
double类型数据存储值E1023.
首先得明确是一个无符号数10.51.0101*2^3E3二进制表示为 0000 0011。IEEE754规定了。对于8bit长度的float类型。e需要加上127在此得到的数再存储到内存中去。31271291000 0010。double类型应该加上1023。至于为什么后面细说。 于是10.5的正确格式应该是上图所示的格式。
至于E为什么要127float1023double。
问0.5该如何存储
转换为二进制科学计数法1*2^-1。如果我们E不做处理。
将会有如下问题s0没有问题E-1E是无符号数不能显示为-1。M存储的是小数部分全部存储为0。
故为了解决E无法表示负数的问题才引入了E127(Float),和E1023(double)。为了描述方便下面统一以float类型为例当E存储值127时认定E为负数如E存储值为125则E的实际值为-2。当E的存储值127时E的真实值为正数1303。以此类推。。。。
故本质上E存储时需要127或1023是为了解决浮点数-1,1注意是不包含边界数的关系的存储问题。
E不全为0或不全为1
这时浮点数就采用下面的规则表示即指数E的计算值减去127或1023得到真实值再将 有效数字M前加上第一位的1。
比如
0.51/2的二进制形式为0.1由于规定正数部分必须为1即将小数点右移1位则为 1.0*2^(-1)其E为-1127126表示为
01111110而尾数1.0去掉整数部分为0补齐0到23位00000000000000000000000则其二进 制表示形式为:
0 01111110 00000000000000000000000
E全为0
这时浮点数的指数E等于1-127或者1-1023即为真实值 有效数字M不再加上第一位的1而是还原为0.xxxxxx的小数。这样做是为了表示±0以及接近于 0的很小的数字。
E全为1
这时如果有效数字M全为0表示±无穷大正负取决于符号位s
回答一开始提出的两个问题
1为什么浮点数不能执行位运算
答整形执行位运算准确的来说是无符号整形才能执行位运算
移位运算和
左移一位相当于数字*2加倍
右移相当于数字/2
根据浮点数的结构来看浮点数明显是达不到这样的效果的。
大家拿起笔思考一下浮点数执行按位与按位或|按位异或等运算时是何种情况。
2浮点型数据转换为整形数据时编译器内部做了什么样的处理
答
#include stdio.h #include stdlib.h
int main() { int a1090; float b1020.23; ab; printf(a的值为%d,a); return 0; }
看输出结果 看起来是似乎很合理浮点数直接去掉小数部分直接将自己的整数部分赋值给了整形数据.其实编译器是先将浮点数值算出来再截取整数部分截取给整形数据。