机器零

机器零 计算机中机器零是指: 如果一个浮点数的尾数全为0,则不论其阶码为何值,计算机在处理时都把这种浮点数当作零看待; 如果一个浮点数的阶码小于它所表示范围的最小值,则不论其尾数为何值,计算机在处理时都把这种浮点数当作零看待。 计算机保存数字的位有限,所能表示最小的数也有范围,当一个表示方式比它所能表示的数更小时,计算机无法表示,就作为0处理,实际上,这个数也很接近0了. 浮点数定义其实就是0.XXXXX * 2^XXXX 零点多少乘以2的多少次方 其中零点多少就是尾数,2的多少次方就是阶码,不管计算机用几位表示阶码,肯定有个表示的范围,一共有负的最大值,负的最小值,正的最大值,正的最小值4种限制. 当一个表示方式中的阶码是负数,而且这个负数小于计算机所能表示的阶码 如以上2的XXX次方中,XXX是负数 (绝对值很大) ,非常小,在数学上这个值就非常接近于零,在计算机上,因为无法表示比这个值更小了,所以就把这个浮点数作为零处理 补充: 不用管位数,先看阶码 假设一个10进制的数,0.9999*10^-9999999999999999999999999, 10的-99999999999999999999999次方,那么这个数是不是很接近0, 不管前面的0.9999是正还是负 对于2进制也一样,0.1111*2^-111111111111111111111111111111 计算机保存数字的位有限,所能表示最小的数也有范围,当一个表示方式比它所能表示的数更小时,计算机无法表示,就作为0处理,实际上,这个数也很接近0了.

2011-07-03 · 1 min · 21 words · -

计算机中的原码、反码和补码

计算机中的原码、反码和补码 一、机器数和真值 机器数 数在计算机中的二进制表示形式就称为机器数。机器数是带符号的,在计算机用一个数的最高位存放符号 (0为正,1为负) ,将数的符号数值化。 十进制中的数 +5 ,计算机字长为8bits,转换成二进制就是00000101。如果是 -5 ,就是 10000101 。 00000101 和 10000101 就是机器数。 真值 因为符号占据一位,机器数的形式值就不等于真正的数值。例如上面的有符号数 10000101,其最高位1代表负,其真正数值是 -5 而不是形式值133 (10000101转换成十进制等于133) 。所以,为区别起见,带符号位的机器数对应的真正数值称机器数的真值。 例: 00100001的真值 = 0 0100001 = +33,10100011的真值 = 1 0100011 = -35 二、计算机符号数的表示方法 符号数值化后,为了方便地对机器数进行算术运算,提高运算速度,人们设计了符号数的各种编码方法,最常见的有原码、反码和补码。 原码 原码就是符号位加上真值的绝对值。简单说,就是符号位加上数的二进制表示。比如,+3 (以8bit为例) ,符号位为0,3转化为二进制就是11,那么 +3 的原码就是00000011 (不足部分补0) 。同理, -3,符号位为1,3转化为二进制就是11,那么 -3 的原码就是10000011 (不足部分补0) 。即: [+3] = [00000011]原 [-3] = [10000011]原 反码 一个负数的符号位不动,其余位取反,就是机器数的另一种表示形式——反码。正数的反码与原码形式一样。 [+3] = [00000011]原 = [00000011]反 [-3] = [10000011]原 = [11111100]反 补码 正数的原码反码补码是一样的。补码符号位不变化其余各位原码取反(反码)+1换言之 反码+1 ...

2011-07-03 · 1 min · 114 words · -

为什么要使用原码 反码 补码.

为什么要使用原码 反码 补码. 前言: 随着学习计算机知识的加深,许多地方都遇到原码、反码、补码。很多关于计算机的书籍都介绍原码、反码、补码的表示方法,但是为什么要用到原码、反码、补码却没详细说。为什么要使用?它们的原理是什么呢?我搜索了许多资料,也查找了许多书籍,终于弄明白了这个问题,收集整理如下。 我们知道数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制。而在日常生活中人们使用的是十进制,并且我们用的数值有正负之分。于是在计算机中就用一个数的最高位存放符号(0为正,1为负)。这就是机器数的原码了。 有了数值的表示方法就可以对数进行算术运算,但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits (1) 10 - (1)10 = (1)10 + (-1)10 = (0)10 (0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 )显然不正确。 ...

2011-07-03 · 1 min · 126 words · -

阶码

阶码 在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码,阶码指明了小数点在数据中的位置。 阶码: 对于任意一个二进制数n,可用N=S×2P表示,其中S为尾数,P为阶码,2为阶码的底,P、S都用二进制数表示,S表示N的全部有效数字,P指明小数点的位置。当阶码为固定值时,数的这种表示法称为定点表示,这样的数称为"定点数";当阶码为可变时,数的这种表示法称为浮点表示,这样的数称为"浮点数",这在前面已有介绍。

2011-07-03 · 1 min · 4 words · -

移码

移码 计算机中的移码 移码 (又叫增码) 是符号位取反的补码,一般用做浮点数的阶码,引入的目的是为了保证浮点数的机器零为全0。 ①移码的定义: 设由1位符号位和n位数值位组成的阶码,则 [X]移=2En + X -2n≤X ≤ 2n 例如: X=+1011 [X]移=11011 符号位"1"表示 正 号 X=-1011 [X]移=00101 符号位"0"表示 负 号 ②移码与补码的关系: [X]移与[X]补的关系是符号位互为相反数 (仅符号位不同) , 例如: X=+1011 [X]补=01011 [X]移=11011 X=-1011 [X]补=10101 [X]移=00101 ③移码运算应注意的问题: ◎对移码运算的结果需要加以修正,修正量为2En ,即对结果的符号位取反后才是移码形式的正确结果。 ◎移码表示中,0有唯一的编码——1000…00,当出现000…00时 (表示-2En) ,属于浮点数下溢。 浮点数的运算规则 浮点加减法的运算步骤 设两个浮点数 X=Mx※2Ex Y=My※2Ey 实现X±Y要用如下5步完成: ①对阶操作: 小阶向大阶看齐 ②进行尾数加减运算 ③规格化处理: 尾数进行运算的结果必须变成规格化的浮点数,对于双符号位的补码尾数来说,就必须是 001×××…×× 或110×××…××的形式 若不符合上述形式要进行左规或右规处理。 ④舍入操作: 在执行对阶或右规操作时常用"0"舍"1"入法将右移出去的尾数数值进行舍入,以确保精度。 ⑤判结果的正确性: 即检查阶码是否溢出 若阶码下溢 (移码表示是00…0) ,要置结果为机器0; 若阶码上溢 (超过了阶码表示的最大值) 置溢出标志。 例题: 假定X=0 .0110011*211,Y=0.1101101*2-10 (此处的数均为二进制) ?? 计算X+Y; 解: [X]浮: 0 1 010 1100110 ...

2011-07-03 · 1 min · 168 words · -

2024

2024 耳鸣差不多已经控制住了 开始测试乳糖牛奶 ENx 已经能满足自己日常使用 开始有计划的每天读书 每天能清空当天的 todo list 开港卡投资美股 完成了一个比较复杂的模块的重写, 1w+ 行单体测试, 第一次大规模使用单体测试, 平稳上线.

2006-01-02 · 1 min · 15 words · -

gdb

gdb GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、 objective-c、PHP等语言。对于一名Linux下工作的c/c++程序员,GDB是必不可少的工具 readelf -S main|grep debug # 查看寄存器的值 i registers # 以上输出不包括浮点寄存器和向量寄存器的内容。使用“i all-registers”命令,可以输出所有寄存器的内容 i all-registers # 打印单个寄存器的值,可以使用“i registers regname”或者“p $regname”,例如: i registers rsi # 用 gdb 调试 hello gdb ./hello # 在 _start 函数处添加一个断点 (gdb) b _start # run (gdb) r # 显示汇编代码, => 表示下一步要执行的行 (gdb) disassemble /m _start # 逐指令往后运行 (gdb) stepi # 查看寄存器的值 (gdb) i registers

2006-01-02 · 1 min · 59 words · -

字面量,常量和变量

“字面量,常量和变量” int a; //变量 const int b = 10; //b 为常量(具名常量, named constants), 10 为字面量 string str = "hello world!"; // str 为变量, hello world!为字面量 看完这个例子,我相信大家都会说,啊,可不就是这样吗?这其中可能稍微有点不太理解的就是字面量。像_常量_啊,_变量_啊, 字面量 在计算机科学中,字面量 (literal) 是用于表达源代码中一个固定值的表示法 (notation) 。几乎所有计算机编程语言都具有对基本值的字面量表示,诸如: 整数、浮点数以及字符串;而有很多也对布尔类型和字符类型的值也支持字面量表示;还有一些甚至对枚举类型的元素以及像数组、记录和对象等复合类型的值也支持字面量表示法。 有个不太好,但是足以说明问题的解释,那就是 对象字面量就是引号引起来的部分,必须是等号右边的部分。虽然这样的解释不太好,但是确实如此,这就是字面量。 const int b = 10; //b为常量,10为字面量 string str = "hello world!"; // str 为变量,hello world!为字面量 变量 有些数据在程序运行中可以变化或者被赋值,这称为变量。 int a; //变量 常量, 具名常量 有些数据可以在程序使用之前预先设定并在整个运行过程中没有变化,这称为常量。 const int b = 10; //b 为常量, 10 为字面量 foo = func_0(b, 11) // func_0有两个参数一个传的是具名常量 b, 一个是常量 11 变量与常量的区别 它们在内存中的存储方式是一样的。只是常量不允许改变,就像只读文件一样。 变量、常量与字面量的区别 字面量是指由字母,数字等构成的字符串或者数值,它只能作为右值出现,(右值是指等号右边的值,如: int a=123这里的a为左值,123为右值。) 常量和变量都属于变量,只不过常量是赋过值后不能再改变的变量,而普通的变量可以再进行赋值操作。 作者: 贺贺v5 链接: https://www.jianshu.com/p/0f2816805da6 来源: 简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1 min · 90 words · -