数值存储

  以补码存储

  十进制&二进制转换,表格法

如,123D -> 01111011B

 

  单精度浮点存储  

  符号位(1 Sign):0正,1负;

  指数位(8 Exponent):需要加偏置值Bias,127 + 指数值;

  尾数部分(23 Mantissa):弃小数点前那个恒1并在右端以0补全位数;

如,1234.625F -> 100 1101 0010.101 -> 1.00 1101 0010 101 * 2^10

Sign    0

Exponent   10,127+10 -> 1000 1001

Mantissa  0011 0100 1010 1000 0000 000

0 1000 1001 0011 0100 1010 1000 0000 000 -> 449A5400

内存中小尾存储,00 54 9A 44     

  双精度浮点存储

  符号位(1 Sign):0正,1负;

  指数位(11 Exponent):需要加偏置值Bias,1023 + 指数值;

  尾数部分(52 Mantissa):弃小数点前那个恒1并在右端以0补全位数;

如,1234.625 -> 100 1101 0010.101 -> 1.00 1101 0010 101 * 2^10

Sign    0

Exponent   10,1023+10 -> 100 0000 1001

Mantissa  0011 0100 1010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000

0 100 0000 1001 0011 0100 1010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 -> 40934A8000000000

内存中小尾存储,00 00 00 00 80 4A 93 40

  浮点指令

.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive

.code

FloatCase proc

mov ebp, esp
sub esp, 5ch
push ebx
push esi
push edi
lea edi, [ebp - 5ch]
mov ecx, 17h
mov eax, 0cccccccch
rep stos dword ptr [edi]
mov dword ptr [ebp - 4], 43000000h //128.0
mov dword ptr [ebp - 8], 40800000h //4.0
mov dword ptr [ebp - 0ch], 40000000h //2.0
mov dword ptr [ebp - 10h], 42000000h //32.0
mov dword ptr [ebp - 14h], 41000000h //8.0
mov dword ptr [ebp - 18h], 0
mov dword ptr [ebp - 1ch], 42b00000h //88.0
fld dword ptr [ebp - 4] //st0 = 128.0
fmul dword ptr [ebp - 8] //st0 = 128.0 * 4.0 = 512.0
fdiv dword ptr [ebp - 0ch] //st0 = 512.0 / 2.0 = 256.0
fst dword ptr [ebp - 4] //[ebp - 4] = st0 = 256.0
fdiv dword ptr [ebp - 4] //st0 = 256.0 / 256.0 = 1.0
fmul dword ptr [ebp - 10h] //st0 = 1.0 * 32.0 = 32.0
fdiv dword ptr [ebp - 14h] //st0 = 32.0 / 8.0 = 4.0
fst dword ptr [ebp - 10h] //[ebp - 10h] = st0 =  4.0
fadd dword ptr [ebp - 1ch] //st0 = 4.0 + 88.0 = 92.0
fst dword ptr [ebp - 10h] //[ebp - 10h] = st0 = 92.0
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp

ret

FloatCase endp

start:
invoke FloatCase
ret

end start

计算出浮点值:
43000000h -> 0100 0011 0000 0000 0000 0000 0000 0000
符号:0正数
指数:1000 0110,128+6-127 -> 7
1.0 * 10^7 -> 1000 0000 -> 128.0f

40800000h -> 0100 0000 1000 0000 0000 0000 0000 0000
符号:0正数
指数:1000 0001,128+1-127 -> 2
1.0 * 10^2 -> 100 -> 4.0f

40000000h -> 0100 0000 0000 0000 0000 0000 0000 0000
符号:0正数
指数:1000 0000,128-127 -> 1
1.0 * 10^1 -> 10 -> 2.0f

42000000h -> 0100 0010 0000 0000 0000 0000 0000 0000
符号:0正数
指数:1000 0100,128+4-127 -> 5
1.0 * 10^5 -> 100000 -> 32.0f

41000000h -> 0100 0001 0000 0000 0000 0000 0000 0000
符号:0正数
指数:1000 0010,128+2-127 -> 3
1.0 * 10^3 -> 1000 -> 8.0f

42b00000h -> 0100 0010 1011 0000 0000 0000 0000 0000
符号:0正数
指数:1000 0101,128+5-127 -> 6
1.011 * 10^6 -> 1011000 -> 88.0f

st0 = 92.0

时间: 2024-11-05 04:58:18

数值存储的相关文章

从java toBinaryString() 看计算机数值存储方式(原码、反码、补码)

一.toBinaryString 方法及其含义 1.1 方法说明 该方法位于java.lang.Integer类中 方法签名:public static String toBinaryString(int i) 含义:返回参数数值的补码形式,正数则忽略前面的0.(官方注释:返回表示传入参数的一个无符号(这里无符号大概单纯指数值前面没有+-号,实则是有符号位) 的二进制字符串.如果参数为负数x,返回的值则为 2^32 + x [就是它的补码]) 1.2 使用示例 System.out.printl

4 C 语言 数值存储方式 数组

源码 补码 反码 数组定义,初始化,使用,随机数 找最大数,逆置,冒泡排序, scanf 输入字符串 字符串处理 字符串溢出等问题 scanf() gets() puts() fputs() strlen() strcat() strncat() strcmp() strncmp() strchr() strstr() strtok() atoi() atof() atol() C 字符串数组 定义数组 遍历输出数组每个元素的值 //GCC 编译方式: C:\MinGW\project>gcc 

一道题回顾计算机数值存储方式-原码,反码,补码

突然想到了计算机的补码,现在利用这个题目回顾一下相关知识点 unsigned char ch = -1; int val = ch; val的最终值是255: 换算成二进制一下,-1的源码:1000 0001,反码:1111 1110 ,负数在计算机中是以补码形式存储的,-1的补码:1111 1111 ch 变量是 无符号的,也就是整个补码的二进制位都是数值位,1111 1111 二进制位换算成十进制就是255,最终赋值给整数结果自然也是255 这道题目考察的就是计算机数值的存储方式,对于正数,

关于oralce数值存储

今天做dump的时候,对oracle的数字存储规则不是明白,就查了一些资料,这个资料不错 http://www.jlcomp.demon.co.uk/number_format.html (来自  : Jonathan Lewis) 做简单翻译如下: JL Computer Consultancy---一家咨询公司 How are numbers stored.ORACLE数据库如何存储数字 November 2001 ---初始版本Updated: Feb 1020 --更新于2010年2月

***mysql中经度纬度字段用什么存储(关于mysql的float和decimal区别)

float,decimal精确度比较 float,double容易产生误差,对精确度要求比较高时,建议使用decimal来存,decimal在mysql内存是以字符串存储的, 用于定义货币要求精确度高的数据.在数据迁移中,float(M,D)是非标准定义,最好不要这样使用.M为精度,D为标度. mysql>  create table t1(c1 float(10,2), c2 decimal(10,2),c3 float); // 10不包括小数点 mysql>  insert into t

Sqlite3中存储类型和数据类型结合文档解析。

sqlite3是个很小的数据库,运行在手机,机顶盒上....那它就不可能像musql,sqlserver那么规范,有很多的数据类型,之前我也以为它定义了很多数据类型,其实不是他就5个存储类,那么多数据类型是根据一整套严谨的规则映射的!!还有什么char,varchar其实都是没有的..下面将结合文档详细讲解,相信看完你会了解更多,其实主要就是翻译文档.... sqlite官网:http://www.sqlite.org/ Sqlite3数据类型 大多数的数据库引擎(到现在据我们所知的除了sqli

MIFARE系列5——存储结构

Mifare S50把1K字节的容量分为16个扇区(Sector0-Sector15),每个扇区包括4个数据块(Block0-Block3),我们也将16个扇区的64个块按绝对地址编号为0~63,每个数据块包含16个字节(Byte0-Byte15),64*16=1024. Mifare S70把4K字节的容量分为40个扇区(Sector0-Sector39),其中前32个扇区(Sector0-Sector31)的结构和Mifare S50完全一样,每个扇区包括4个数据块(Block0-Block

ECMA Script 6_数值的扩展

1. 二进制 和 八进制 新的表示法 前缀 0b(或0B) 表示 二进制 前缀 0o(或 0O )表示 八进制 console.log(0b111110111 === 503); // true console.log(0o767 === 503); // true 如果要将 0b 和 0o 前缀的字符串数值 转为十进制,要使用 Number() 方法 2. Number.isFinite() 检查一个数值是否为有限的(finite),即 不是 Infinity 返回 true 只对数值有效 如

Python基础学习笔记

Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单. 2.易于阅读:Python代码定义的更清晰. 3.易于维护:Python的成功在于它的源代码是相当容易维护的. 4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好. 5.互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断. 6.可移植:基于其开放源代码的特性,Py