原码

反码、原码、补码及位运算

家住魔仙堡 提交于 2019-12-05 14:00:13
JAVA的基本数据类型及其取值范围 类型 存储需求 bit 数 取值范围 备注 int 4字节 4*8 -2147483648~2147483647 即 (-2)的31次方 ~ (2的31次方) - 1 short 2字节 2*8 -32768~32767 即 (-2)的15次方 ~ (2的15次方) - 1 long 8字节 8*8 即 (-2)的63次方 ~ (2的63次方) - 1 byte 1字节 1*8 -128~127 即 (-2)的7次方 ~ (2的7次方) - 1 float 4字节 4*8 float 类型的数值有一个后缀 F(例如:3.14F) double 8字节 8*8 没有后缀 F 的浮点数值(例如:3.14)默认为 double boolean 1字节 1*8 true、false char 2字节 2*8 Java中,只要是字符,不管是数字还是英文还是汉字,都占两个字节。 反码、原码、补码 在计算机系统中,数字一律用补码来表示、运算和存储。 原码 :最高位为符号位的二进制数。 反码 :正数的反码是其本身,负数的反码在其原码的基础上,符号位不变,其余各个位取反。 补码 :正数的补码是其本身,负数的补码在其原码的基础上,符号位不变,其余各位取反,最后+1。 由来 : 本来的二进制数是没有正负的,为了区分正负数,将二进制的最高位用来表示正负(0表示正

数据的表示与运算-浮点数

醉酒当歌 提交于 2019-12-05 05:29:05
数据的表示与运算-浮点数 前言: 计算机中,数字分为定点数和浮点数。相对于浮点数,定点数比较好理解,原码补码反码移码。而浮点数十分繁杂。 关于浮点数的繁杂,我觉得最好的解释就是, \(William\ M. Kahan\) 因其在浮点数运算标准的制定上的突出贡献而获得图灵奖。 \(Kahan\) 也是浮点数 \(IEEE754\) 标准的主要设计师。 初识浮点数: 假如说我们现在想要表示光速这样一个数值,我们可以怎么做? \(1:\) 采用整数方式把他写出来,那么就是 \(300...00m/s\) 。这样数字十分的长,与计算机不好保存。 \(2:\) 采用科学计数法,那么就是 \(3*10^{8}m/s\) ,那么如果我现在想保存这个数字,那么我只需要记录三个信息,第一个是 \(3\) ,第二个是 \(10\) ,第三个是 \(8\) 。 两种方法比较: 很明显第一种方法需要我们用更多的存储空间来保存它,而对于科学计数法,我们并不需要记录那么多的数却能表示同样的数值。 对于计算机而言,只能认识 \(0/1\) 符号,这在硬件实现上更为方便简单。所以我们这时候可以把 \(10\) 这个底数给取消掉,计算机默认他是 \(2\) ,这样我们就可以只用保存两个数字,来表示这样一个大的数字。 对于表示电子的质量,太阳系的直径,这样非常极端的数字时,科学计数法的优势显得更为明显。它更方便。

二进制补码(负数编码)、反码、原码

寵の児 提交于 2019-12-05 02:55:12
一、补码 补码是对负整数在计算机中存储的一种形式; 第二种形式的负数在计算机中可以使用 (负号加数字)的形式表示一个负数;例如(-3 以1000 0011 存储)但是使用这种方法表示的只有(+0,-0),而且不可以做算术运算。 二、计算机数和真值 讨论二进制编码之前,首先来了解一下什么是计算机数和真值 (一)计算机数 一个数在计算机中的二进制表示形式,叫做这个数的机器数 。 机器数数带符号的,由于计算机内部的硬件只能表示两种物理状态,在 计算机使用一个数的最高位存放符号,正数为 0,负数为 1。 例如: 十进制中的 +5 和 -5,计算机字长为8位,分别转换为 00000101 和 10000101;这里面的 00000101 和 10000101 就是机器数 机器数的特点: 一个数值的二进制表现形式,就叫做这个数的机器数。二进制的位数是受机器设备的限制的。机器内部设备一次能表示的二进制位数叫做机器的字长,一台机器的字长数固定的。 字长8位的叫做一个字节(Byte),机器字长一般都是字节的整数倍,如字长 8位、16位、32位、64位。 机器数的分类: 根据小数点位置固定与否,机器数又可以分为定点数和浮点数。通常使用 定点数表示 整数,使用 浮点数表示 实数: 1、整数 :整数没有小数部分,小数点固定在数的最右边。整数可以分为(1) 无符号整数 和 (2) 有符号整数 两类。

原码、反码、补码和位运算

江枫思渺然 提交于 2019-12-04 20:12:59
参考: https://www.zhihu.com/question/20159860 https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 总结一些要点 为了使计算机运算数据更加简单,减法转换为加法: 1 - 1 => 1 + (-1)。为了支持这个功能,计算机对数据的存储需要一些额外的处理。 原码:最高位作为符号位,也就是对于1和-1的区别,只是最高位不一样。 反码:正数的反码和原码是一致的,而负数,除了最高位是1,其余位取反。 补码:正数的补码和原码是一致的,而负数的补码是负数的反码+1,+1之后可能会触发进位,导致最高位由1变成0,这种情况下所有位都是0了,也就是数字的值为0,因为0没有正负之分,所以可以认为补码表示法中,计算机认为最高位是1的都是负数,其余都是正数或者0 计算机采用补码的编码方式来存储数字 ,如以4位的数字长度表示 3 + (-3): 3的补码 = 3的原码 = 0011 -3的补码 = -3的反码(1100) + 1 = 1101 0011 + 1101 = 10000,因为这里数字位为4,超出的被丢弃掉,所以运算结果是0000 = 0 根据补码的规律,计算出实际的数值,如 1010 0000 0000 0000 0000 0000 0000 0000 -1之后

汇编基础知识

帅比萌擦擦* 提交于 2019-12-04 11:26:14
1: 数据的表示 微型计算机的字长与微处理器的寄存器位数有关。 以 Intel 80X86 系列微处理器为例,CPU 是 8086/8088、80286 的字长是 16 位(二进制位 bit),那么它们的寄存器的位数一定是 16 位的; 32 位字长的微机 CPU 是 80386/80486 或者 Pentium 系列,它们的寄存器的位数则是 32 位的。 学习汇编语言我们会用到十六进制(H)的数据形式,要使自己尽快习惯用十六进制来思维。在汇编语言中,数值后面分别用字母 B 、 H 、 D 代表二进制(Binary)、十六进制(Hexadecimal)、十进制数(Decimal)(十进制数可以省略 D )。 在计算机中还规定采用字节、字、双字等单位来表示数据。 字节(Byte):8 位二进制数。如 00000101B 或表示成 05H ; 10000101B 或表示成 85H 。 字(Word):16 位二进制数,等于 2 字节。如 1100010111010110B 或表示成 C5D6H 。 双字(Double Word):32 位二进制数,又称为双精度数,等于 4 字节。如 23456789H 。 2: 寄存器的分类 8086 寄存器都是 16 位的寄存器,根据用途可分为 4 种类型。分别是数据寄存器、地址寄存器、段寄存器和控制寄存器 (1)数据寄存器

3.关于无符号类型和char的一些必懂知识

自古美人都是妖i 提交于 2019-12-04 09:05:18
3.1. 输出一个用负数赋值的无符号类型声明的变量或者输出一个两个无符号类型声明的变量相减的结果的结果是什么? 1 unsigned int num=1; 2 unsigned int num1 = 2; 3 std::cout << num - num1; 这里的结果应当是(-10)mod (int类型的最大值加1)得到的结果,mod 运算的结果符号看右边的值,显然是正数的结果,32位机器的int是最大值4294967295,所以最后的结果是4294967295。不是应该是10吗?如何从计算机存储的角度看待这个结果呢?数值在计算机中的的存储是用原码,反码和补码的来解决的,而且只保留了加法运算,补码解决了原码正负相加结果不符实际和反码无法区分正负0的弊端,这里不再赘述,具体看转的文章中有。-1的二进制补码是1111 1111 1111 1111...1111将它转换为无符号数后,恰好为4294967295,原码和补码具有一致性,于是就有了上述的结果。 3.2.char 中的字符集是怎么回事?如何将字符的0~9转换成int? (1)字符集是用八进制或者十六进制数字对可打印和不可打印的字符进行编码使之一一对应,在C++中可以使用转义序列'\'进行对应的输出。 (2)因为0~9对应的字符集中是连续的,只需要拿该字符减去‘0’即可得到对应的int数字 来源: https://www

原码反码补码

旧时模样 提交于 2019-12-04 02:27:44
1.原码 最高位为符号位;0表示正数,1表示负数。 ●可直观的反映出数据的大小。 2.反码 正数的反码与其原码相同; 负数的反码,符号位不变,其余位都取反。 ●解决了负数加法运算问题,将减法运算转化为加法运算。 3.补码 正数的补码与其原码相同; 负数的补码在其原码的末位加1。 ●解决了负数加法运算±0的问题。 来源: https://www.cnblogs.com/mznsndy/p/11828503.html

计算机的运算方法

邮差的信 提交于 2019-12-03 15:25:36
计算机的运算方法 无符号数 计算机中的数存放在寄存器中,通常将寄存器的位数称为机器字长, 大家说的无符号数其实就是不区分正负号的数,换句话说,就是没负数,全是正数,大家知道,计算机中的数是以0-1存储的, 假如我们的寄存器16位, 无符号数表示的范围就是0~65535 (2^64=65536), 有符号就是分正负数,总数65536就被分成两半,一半正数,一般负数,范围就是 -32768~32767 有符号数 有符号数,就是正负数同时存在, 人们固然能区分开整正负数,计算机怎么区分呢? 前面说了,计算机只认识01这样的数,于是人们规定 0表示正数, 1表示负数, 于是这样符号就被数字化了, 并且规定将其放在真实值前面, 于是有符号数就诞生了 如上图,按照计算机存数数据的特性将符号数字化, 数字化后的编码方式得到的结果称为 机器数 , 将带有+-符号的数字称为 真值 既然现在将有符号数数字化后,新的问题来了,当这些机器数之间需要进行运算时, 符号位怎么办? 符号位能否参加机器数之间的运算呢? 如果说,需要参加运算又需要哪些处理才能消除符号位对计算结果的影响呢? 这一连串问题就引出了符号位和数值位所构成的编码: 原码 , 补码 , 反码 , 移码 其实在学习的过程中该一直问自己,自己在干什么??? 就比如现在,我在前面大概说了说计算机是如何表示数字的,于是认识了机器码

二进制的原码、补码、反码

血红的双手。 提交于 2019-12-03 01:46:06
最近看Python一道练习题: a = 234 b = ~a print(b) #得到-235 涉及到负数补码,所以找资料稍微研究了一番,过程如下: [0]1110 1010 (234,[]里表示符号位) 取反后:[1]0001 0101,因为符号位是1表示负数,负数补码存储,需要取反并加1: [1]0001 0101 ->取反加1 -> [1]1110 1011,就是-235。 总结: 正整数的补码是其二进制表示,与原码相同。 负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。(即:取反加1) 相关链接: 百度百科 补码 (解释还是很细致的) 百度百科 原码 来源: https://www.cnblogs.com/vaiky/p/11769899.html