打印一个浮点数组,会输出字符串"Hello, world“ & 浮点数的二进制表示(IEEE 754标准)
#include <stdio.h>
#include<stdlib.h>
int main()
{
float a[3] = { 1143139122437582505939828736.0, 76482007234779498639230238720.0, 9.222452464e-39 };
printf("%d\n", sizeof(float));
printf("%s\n", a);
system("pause");
return 0;
}
这种表示方法通常被用于掩盖原始数据用的(比如:加密处理等)。
要想打印出Hello world,需要定义一个字符串,比如:
char str[12] = "Hello world";
字符串str一共12个字符(包含结束符),分别是:
H、e、l、l、o、空格、w、o、r、l、d、'\0'
这些字符,在内存中是按照ASCII码保存的,对应的ASCII码分别是:
72,101,108,108,111,32,119,114,108,100,0
ASCII码对应的16进制数值,分别是:
0x48,0x65,0x6C,0x6C,0x6F,0x20,0x77,0x6F,0x72,0x6C,0x64,0x00
由上可知,如果想打印出helloworld,就必须在内存中有一段连续的内存,
这个内存,长度为12字节,内容(16进制)是48,65,6C....64,00。
在回过头来看看浮点数数组float a[3]。
sizeof(float)的大小是4个字节,
那么a[3]就是12个字节(即内存中有一个连续的内存,长度12字节)。
这12个字节中,有3个数字,每个数字长度4字节。
其中第一个数字1143139122437582505939828736.0,
它在内存中的16进制数据是:48 65 6C 6C(原理请百度“浮点数的二进制表示”)
同理,另外两个数字,在内存中的数据(16进制)是:
6F,20,77,6F和72,6C,64,00
这三个数字的内存数据连起来,刚好和helloword的内存数据相符。
注意,我们对字符串内存进行分析的时候,是逐个字节进行解释的
(即每个字节是什么字符)。
而我们对float[3]进行分析的时候,是每4个字节进行分析的,
(即每个float是什么数字)
同一段内存,使用不懂的视角(字符串or浮点数数组)来看,
得到的结果就是不一样的。这就是计算机的有趣之处。
扩展,如果把浮点数数组的定义,更换成下面的形式(int数组或short数组),一样可以得到hello world的。
int a[3] = {1819043144,1870078063,6581362};
short a[6] = {25928,27756,8303,28535,27762,100};
//摘自https://wenda.so.com/q/1462786652721707
浮点数是我们在程序里常用的数据类型,它在内存中到底是怎么样的形式存在,是我了解之前是觉得好神奇,以此记录,作为学习笔记。
现代计算机中,一般都以IEEE 754标准存储浮点数,这个标准的在内存中存储的形式为:

对于不同长度的浮点数,阶码与小数位分配的数量不一样,如下:

对于32位的单精度浮点数,数符分配是1位,阶码分配了8位,尾数分配了是23位。
根据这个标准,我们来尝试把一个十进制的浮点数转换为IEEE754标准表示。
例如:178.125
先把浮点数分别把整数部分和小数部分转换成2进制
整数部分用除2取余的方法,求得:10110010
小数部分用乘2取整的方法,求得:001
合起来即是:10110010.001
转换成二进制的浮点数,即把小数点移动到整数位只有1,即为:1.0110010001 * 2^111,111是二进制,由于左移了7位,所以是111
把浮点数转换二进制后,这里基本已经可以得出对应3部分的值了
数符:由于浮点数是正数,故为0.(负数为1)
阶码 : 阶码是需要作移码运算,在转换出来的二进制数里,阶数是111(十进制为7),对于单精度的浮点数,偏移值为01111111(127)[偏移量的计算是:2^(e-1)-1, e为阶码的位数,即为8,因此偏移值是127],即:111+01111111 = 10000110
尾数:小数点后面的数,即0110010001
最终根据位置填到对位的位置上:

可能有个疑问:小数点前面的1去哪里了?由于尾数部分是规格化表示的,最高位总是“1”,所以这是直接隐藏掉,同时也节省了1个位出来存储小数,提高精度
---------------------
作者:Kelvin7_Feng
来源:CSDN
原文:https://blog.csdn.net/fwb330198372/article/details/70238982
版权声明:本文为博主原创文章,转载请附上博文链接!
打印一个浮点数组,会输出字符串"Hello, world“ & 浮点数的二进制表示(IEEE 754标准)的更多相关文章
- (转)从Python的0.1输出0.1000000000000001说浮点数的二进制
原文地址:http://blog.csdn.net/u012843100/article/details/60885763 今天在学习Python核心编程的时候,十进制浮点数那段看到一个有趣的事情. ...
- 打印一个浮点值%f和%g
详见代码 后续或有更新 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { fl ...
- javascript 如何打印、输出数组内容(将数组内容以字符串的形式展示出来)
1.情景展示 在实际开发过程中,为了调试,有时我们需要看数组中具体包含了哪些数据,但是, 如果我们直接打印该数组对象,显示的结果却不是我们想要的. 如何才能将数组内容打印出来呢?(将数组内容以 ...
- 信1705-2 软工作业最大重复词查询思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中。 (2)定义一个Map,key是字符串类型,保存单词;value是数字类型,保存该单词出现的次数。 (3)遍历(1)中得到的字符串数组,对于每一个单词,考察Map的key中是否出现过该单词,如果没出现过,map中增加一个元素,key为该单词,value为1(
通过学习学会了文本的访问,了解一点哈希表用途.经过网上查找做成了下面查询文章重复词的JAVA程序. 1 思 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词 ...
- 使用基础知识完成java小作业?强化练习-1.输入数组计算最大值-2.输出数组反向打印-3.求数组平均值与总和-4.键盘输两int,并求总和-5.键盘输三个int,并求最值;
完成几个小代码练习?让自己更加强大?学习新知识回顾一下基础? 1.输入数组计算最大值 2.输出数组反向打印 3.求数组平均值与总和 4.键盘输两int,并求总和 5.键盘输三个int,并求最值 /* ...
- 代码实现:定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)
package com.loaderman.test; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; im ...
- java—数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出例如 input {2, 3, 4, 5} output: {60, 40, 30, 24}
/** * 小米关于小米笔试题 数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = * input数组中,除了input[i] 之外的 ...
- C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段
C 一个字符串有三段,第一段原样输出.第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段 比如:输入abc 11 12.输出abc12121212 #include<stdio.h&g ...
- 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度。 2)输出字符串中第一个出现字母a的位置。 3)在字符串的第3个字符后面插入子串“hello”,输出新字符串。 4)将字符串“hello”替换为“me”,输出新字符串。 5)以字符“m”为分隔符,将字符串分离,并输出分离后的字符串。 */
namespace test4 {/* 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度. 2)输出字符串中第一个出现字母a的位置. 3)在字符串的第3个字符 ...
随机推荐
- 2>&1的含义解释
某次想将adb的help信息保存起来 F:\android系统\AndroidTool_Release_v2.\bin>adb >help.txt 结果 F:\android系统\Andr ...
- libev个人问题解惑
我们的游戏后端一直以来用的都是libev,之前尝试过去读源码,因为里面用了大量宏和自己也不够耐心的原因,一直没有看懂.这次终于痛下决心,一定要啃下它,于是在这个星期调整自己的工作学习方式(在读源码的过 ...
- 用PS修改PNG格式图标的颜色
需求:将黑色的PNG格式图标,更改为其它颜色 原始图标: 原始图标 - 黑色 方法1: 图层样式 -> 颜色叠加 选择颜色叠加 选择想要的颜色 方法2: 更换颜色 一 ...
- 线段树优化建图 || CF786B Legacy
题面:786B - Legacy 代码: #include<cstdio> #include<cstring> #include<iostream> #includ ...
- Solaris 11中配置基于link的IPMP
http://blog.itpub.net/29960937/viewspace-1347901/ Tips: Record and feedback errors you have encounte ...
- VCL界面控件DevExpress VCL Controls发布v19.1.2|附下载
DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...
- gitlab搭建之互备模式
gitlab搭建之互备模式 gitlab搭建之互备模式 前言:gitlab目前默认的部署方式是本地单机部署,为了提高gitlab环境的可靠性和稳定性,必须构建一套互备搭建方案:借助gitolilt ...
- 【leetcode】1190. Reverse Substrings Between Each Pair of Parentheses
题目如下: Given a string s that consists of lower case English letters and brackets. Reverse the strings ...
- vue-router的路由
路由和组件是有区别的:组件一般是在同一个页面的不同模块,但是路由是直接切换到另一个页面,之前的页面销毁. App.vue中的router-view会渲染顶级路由匹配到的组件.组件内部嵌套的router ...
- LeetCode - LRU怎么将书架上的旧书完美淘汰呢
你有一排书架,有空时会拿些书来看,经常性会买些新书.无奈书架容量有限,当新买的书放不下时,需要一个策略将旧书淘汰. LRU(最近最少使用)缓存淘汰机制正合适. 1)新买的书放在最左侧. 2)最近常看的 ...