#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标准)的更多相关文章

  1. (转)从Python的0.1输出0.1000000000000001说浮点数的二进制

    原文地址:http://blog.csdn.net/u012843100/article/details/60885763 今天在学习Python核心编程的时候,十进制浮点数那段看到一个有趣的事情. ...

  2. 打印一个浮点值%f和%g

    详见代码 后续或有更新 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { fl ...

  3. javascript 如何打印、输出数组内容(将数组内容以字符串的形式展示出来)

        1.情景展示 在实际开发过程中,为了调试,有时我们需要看数组中具体包含了哪些数据,但是, 如果我们直接打印该数组对象,显示的结果却不是我们想要的. 如何才能将数组内容打印出来呢?(将数组内容以 ...

  4. 信1705-2 软工作业最大重复词查询思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中。 (2)定义一个Map,key是字符串类型,保存单词;value是数字类型,保存该单词出现的次数。 (3)遍历(1)中得到的字符串数组,对于每一个单词,考察Map的key中是否出现过该单词,如果没出现过,map中增加一个元素,key为该单词,value为1(

    通过学习学会了文本的访问,了解一点哈希表用途.经过网上查找做成了下面查询文章重复词的JAVA程序. 1 思 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词 ...

  5. 使用基础知识完成java小作业?强化练习-1.输入数组计算最大值-2.输出数组反向打印-3.求数组平均值与总和-4.键盘输两int,并求总和-5.键盘输三个int,并求最值;

    完成几个小代码练习?让自己更加强大?学习新知识回顾一下基础? 1.输入数组计算最大值 2.输出数组反向打印 3.求数组平均值与总和 4.键盘输两int,并求总和 5.键盘输三个int,并求最值 /* ...

  6. 代码实现:定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)

    package com.loaderman.test; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; im ...

  7. 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] 之外的 ...

  8. C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段

    C 一个字符串有三段,第一段原样输出.第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段 比如:输入abc 11 12.输出abc12121212 #include<stdio.h&g ...

  9. 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度。 2)输出字符串中第一个出现字母a的位置。 3)在字符串的第3个字符后面插入子串“hello”,输出新字符串。 4)将字符串“hello”替换为“me”,输出新字符串。 5)以字符“m”为分隔符,将字符串分离,并输出分离后的字符串。 */

    namespace test4 {/* 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度. 2)输出字符串中第一个出现字母a的位置. 3)在字符串的第3个字符 ...

随机推荐

  1. vue修改富文本中的元素样式

    富文本编辑器目前应用很广泛,而有时候我们想要对其中的一些元素的样式进行修改,就会遇到问题. 首先,直接修改是不可行的,因为是用v-html标签进行渲染的,无法直接获取到. 在修改的时候,一般是按标签进 ...

  2. Webdriver处理页面元素的方式

    Webdriver执行JavaScript代码的方式 WebDriver driver = new ChromeDriver(); JavascriptExecutor jse = (Javascri ...

  3. htmlunit与Jsoup

    //这个函数的目的是在获取页面的同时,也获取链接对应的cookiepublic static HtmlPage getCookieAndHtml(String url)throws IOExcepti ...

  4. FPDF_CHAR_INFO

    typedef struct { FX_WCHAR m_Unicode; FX_WCHAR m_Charcode; FX_INT32 m_Flag; FX_FLOAT m_FontSize; FX_F ...

  5. Spring Boot JPA - Querydsl

    https://lufficc.com/blog/spring-boot-jpa-querydsl

  6. pushd&popd&dirs命令

    dirs 显示当前目录栈中的所有记录 -p  一个目录一行显示  -l  以完整格式显示  -c  删除目录栈中的所有记录  -v  每行一个目录来显示,每个目录前加上编号  +N  从左到右的第n个 ...

  7. vue 解决axios 跨域问题

    闲着没事,假期敲vue 请求数据,总结下vue跨越问题 第一种.服务器服务器不支持跨域请求   1.当跨域无法请求的时候我们可以修改工程下config文件夹下的index.js中的dev:{}部分. ...

  8. 五大Linux简单命令解决系统性能问题

    五大Linux简单命令解决系统性能问题 2010-12-17 10:07 James Turnbull TechTarget中国 字号:T | T 管理Linux主机的性能看起来经常象是在变魔术一样. ...

  9. Python-Django的windows环境

    下载安装python2.7 : 最好是安装win32的,64bit的很多的lib都不支持.python-2.7.3 http://python.org/getit/releases/2.7.3/ 下载 ...

  10. VC内联汇编和GCC内联汇编的语法区别

    VC: #include <stdio.h> main(){ int a = 1; int b = 2; int c; __asm{ mov eax,a mov ebx,b mov ecx ...