二进制代码

二进制中补码计算简单详实的讲解

十年热恋 提交于 2019-11-30 19:43:39
本文说明一个基本的问题,补码的问题。 需要说明一点补码是对负整数在计算机中存储的一种形式;另一种形式是负数在计算机中可以用符号+负数绝对值的形式表示一个负数;比如(-3: 1000 0011存储)但是这种表示的负数有两个零+0,-0,最要命的一点是不能做算术运算。比如10-3=10+(-3)=0000 1010+ 1000 0011=1000 1101=-13显然是错的。所以负整数必须以补码存储。 负数在计算机中如何表示? 举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢? 很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号位。那么,+8就是00001000,而-8则是10001000。 但是,随便找一本《计算机原理》,都会告诉你,实际上,计算机内部采用2的补码(Two’s Complement)表示负数。 在讲补码之前简单介绍机器数,真值,原码和反码的背景。 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数0,负数为1。 1 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是0000 0011。如果是 -3 ,就是 1111 1101 。那么,这里的 00000011 和 1111

2019-2020-1学期 20192429 《网络空间安全专业导论》第一周学习总结

我怕爱的太早我们不能终老 提交于 2019-11-30 19:09:20
2019-2020-1学期 20192429 《网络空间安全专业导论》第一周学习总结 第二章 二进制数值与记数系统 2.1 数字与计算 数字:抽象数学系统的一个单位,服从算术法则。 自然数:0或通过在0上重复加1得到的任何数。 负数:小于0的数,是在相应的正数前加上负号得到的数 整数:自然数、自然数的负数或0 有理数:整数或两个整数的商(不包括被0除的情况) 2.2位置记数法 基数:记数系统的基本数值,规定了这个系统中使用的数字量和数位位置的值 基数还决定了数位位置的含义,当给记数系统中的最后一个数加1后,必须执行数位位置左移 位置记数法:数位按顺序排列,每一个数位有一个位置,数字的值是每个数位和位值的乘积之和 0的重要性:0的发现给人类思维无限的潜力,没有其他的人类创新可以给人类智能的发展带来如此深远的影响。 2.2.1 二进制、八进制和十六进制 任何记数系统中的最大数字比基数小1,eg:以10为基数的记数系统具有十个数字(0-9) 2.2.2 其他记数系统中的运算 二进制加法使用 进位 二进制减法使用 借位 2.2.3 以2的幂为基数的记数系统 把二进制数转换成八进制数,从最右边的二进制数位起,每三个数位一组,将每组数字转换成相应的八进制数 表示一位十六进制数需要四位二进制数 2.2.4 把十进制数转换成其他数制的数 •转换十进制数的规则涉及新基数的除法 While(商不是0)

C++位运算符

ぃ、小莉子 提交于 2019-11-30 19:07:11
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。 C 语言提供的位运算符列表: 运算符 作用 示例 & 按位与 两个操作数同时为1结果为1 | 按位或 两个操作数只要有一个为1,结果就为1 ~ 按位非 操作数为1,结果为0;操作数为0,结果为1 ^ 按位异或 两个操作数相同,结果为0;不相同结果为1 << 左移 右侧空位补0 >> 右移 左侧空位补符号位 1 、“按位与”运算符(&) -- 按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,A=true,B=true,则A∩B= true。 例如: 3&5 3 的二进制编码是11(2)。(为了区分十进制和其他进制,本文规定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位。二进制系统中,每个0或1就是一个位。将11(2

Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64

寵の児 提交于 2019-11-30 15:15:10
一、概要 平时项目开发中,可能使用第三方提供的静态库.a,如果.a提供方技术不成熟,使用的时候就会出现问题,例如: 在真机上编译报错:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386). 在模拟器上编译报错:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 armv6). 要解决以上问题,就要了解一下Apple移动设备处理器指令集相关的一些细节知识。 二、几个重要概念 1、ARM ARM处理器,特点是体积小、低功耗、低成本、高性能,所以几乎所有手机处理器都基于ARM,在嵌入式系统中应用广泛。 2、ARM处理器指令集 armv6|armv7|armv7s|arm64都是ARM处理器的指令集,这些指令集都是向下兼容的,例如armv7指令集兼容armv6,只是使用armv6的时候无法发挥出其性能,无法使用armv7的新特性,从而会导致程序执行效率没那么高。 还有两个我们也很熟悉的指令集:i386|x86_64 是Mac处理器的指令集,i386是针对intel通用微处理器32架构的。x86_64是针对x86架构的64位处理器

Apple移动设备默认指令集

喜夏-厌秋 提交于 2019-11-30 15:14:54
armv6 设备: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch armv7 设备: iPhone3GS, iPhone4, iPhone4S iPad, iPad2, iPad3(The New iPad), iPad mini iPod Touch 3G, iPod Touch4 armv7s设备: iPhone5, iPhone5C, iPad4(iPad with Retina Display) arm64 设备: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display) XCode中与指令集相关的选项 (Build Settings 面板下 Architectures): Architectures: 指明选定Target要求被编译生成的二进制包所支持的指令集支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,从而会造成最终编译生成的包很大。 Valid Architectures: 指明可能支持的指令集并非Architectures列表中指明的指令集都会被支持,Valid Architectures限制可能被支持的指令集的范围,即Valid

Qt 中的二进制兼容策略(简而言之就是地址不能变,剩下的就是让地址不变的技巧)

时光毁灭记忆、已成空白 提交于 2019-11-30 13:38:22
本文翻译自 Policies/Binary Compatibility Issues With C++ 二进制兼容的定义 如果程序从一个以前版本的库动态链接到新版本的库之后,能够继续正常运行,而不需要重新编译,那么我们就说这个库是二进制兼容的。 如果一个程序需要重新编译来运行一个新版本的库,但是不需要对程序的源代码进一步的修改,这个库就是源代码兼容的。 二进制兼容性可以节省很多麻烦。这使得为特定平台分发软件变得更加容易。如果不确保版本之间的二进制兼容性,人们将被迫提供静态链接的二进制文件。静态二进制文件不好,因为它们 浪费资源(尤其是内存) 不能让程序从库中错误修正或扩展中受益 如何确保二进制兼容 在确保二进制兼容的情况下,我们能做的操作: 增加非虚函数、signal/slots、构造函数 增加枚举到类中 在已经存在的枚举的最后添加枚举值 例外:如果这会导致编译器为枚举选择更大的底层类型,那么更改会导致二进制不兼容。需要注意的是,编译器有选择基础类型的余地,所以从 API 设计的角度来看,建议添加一个 Max 枚举,其中包含一个明确的最大值(=255 或 =1 << 15 等)来创建一个数字枚举数值的区间,使其无论如何能够保证适合所选择的底层类型。 重新实现在父非虚基类 (从当前类回溯第一个非虚基类)里定义的虚函数,但是这个不完全确保二进制兼容,所以尽量不要这么做 例外: C++

记录下进制转换 2进制 , 8进制 , 10进制 , 16进制 , 介绍 及 相互转换 及 快速转换的方法

痞子三分冷 提交于 2019-11-29 20:54:39
为什么要使用进制数 数据在计算机中的表示,最终以二进制的形式存在 , 就是各种 <黑客帝国>电影中那些 0101010… 的数字 ; 我们操作计算机 , 实际 就是 使用 程序 和 软件 在 计算机上 各种读写数据, 如果我们直接操作二进制的话 , 面对这么长的数进行思考或操作,没有人会喜欢。 C,C++ 语言 没有提供在代码直接写二进制数的方法。 用16进制或8进制可以解决这个问题。 因为,进制越大,数的表达长度也就越短。 之所以 使用 16或8进制,而不其它的,诸如9或20进制 . 是因为2、8、16,分别是2的1次方、3次方、4次方。这一点使得三种进制之间可以非常直接地互相转换 ; 8进制或16进制 既 缩短了二进制数,还能 保持了二进制数的表达特点。转换还方便 . 进制的介绍 进制 : 是计算机中数据的一种表示方法。 N进制的数可以用0~(N-1) 的数表示, 超过9的用字母A-F 表示 . 10进制 先说 我们最 熟悉的 10进制 , 就是 用 0~9 的数表示 , 逢 10 进 1 . 16进制 如果是 16 进制 , 它就是 由 0-9,A-F组成, 与10进制的对应关系是:0-9 对应 0-9;A-F对应10-15; 字母不区分大小写。 2进制 和 8进制 2进制 由 0-1组成 8进制 由 0-7组成 进制的转换公式 1. 二进制转换十进制 2. 八进制转换十进制

day2

拜拜、爱过 提交于 2019-11-29 19:18:04
阅读目录 上节拾遗 二进制 字符编码 基本数据类型 回到顶部 上节拾遗 变 量的创建与id 例1:name = 'oldboy' 首先,当我们定义了一个变量name = ‘oldboy’的时候,在内存中其实是做了这样一件事: 程序开辟了一块内存空间,将‘oldboy’存储进去,再让变量名name指向‘oldboy’所在的内存地址。如下图所示: 例 2:两个变量名一个值 提问:当我执行下面这段代码的时候,程序是怎么处理的呢? name1 = 'oldboy' name2 = 'oldboy' 我们猜想会有两种可能: 第一种情况:程序分别在内存中开辟了两块儿空间来存储‘oldboy’这个值,并且让name1和name2指向这两个值。如下左图 第二种情况:由于两个值内容一致,所以程序只开辟一块儿空间存储‘oldboy’,并让name1和name2只想着个值。如下右图 提问:大家来猜测一下会是哪种情况? 其实上面的两种猜想都是对的。正常情况下字符串在内存里就是如我们猜想的第一种情况一样,每一次创建一个变量都会在内存中申请一块儿空间。 但是,python认为一些“看起来像python标识符的字符”和小整数字在开发中是常用的,因此出于节省内存的角度思考,对于这部分字符串和数字做出了优化[-5,257)

java中位运算^,&,<<,>>,<<<,>>>总结

荒凉一梦 提交于 2019-11-29 19:11:18
1.^(亦或运算) ,**针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算的结果是 :"+(2^3)); //打印的结果是: 2^3运算的结果是 :1 } 2 =======>0010 3 =======>0011 2^3就为0001,结果就是1 2.&(与运算) 针对二进制,只要有一个为0,就为0 还是上述的例子 public static void main(String[] args) { System.out.println("2&3运算的结果是 :"+(2&3)); //打印的结果是: 2&3运算的结果是 :2 } 3.<<(向左位移) 针对二进制,转换成二进制后向左移动3位,后面用0补齐 public static void main(String[] args) { System.out.println("2<<3运算的结果是 :"+(2<<3)); //打印的结果是: 2<<3运算的结果是 :16 } 4.>>(向右位移) 针对二进制,转换成二进制后向右移动3位, public static void main(String[] args) { System.out.println("2>>3运算的结果是 :"+(2>>3)); //打印的结果是:

程序员是如何神不知鬼不觉的弄丢银行1分钱的? ...

a 夏天 提交于 2019-11-29 19:10:32
原文链接:https://bbs.51cto.com/thread-1568463-1.html 前段时间和某银行合作共同开发了适合我们的一套支付系统。最近,我们对账发现某些订单始终都对不齐。银行的下单金额与对账金额始终少了1分钱。 这就奇怪了,如果这种异常订单一多就是少了很多钱。在涉及钱的金融领域,这是个很谨慎严肃的问题。 我们跟银行排查发现了问题的原因,也就是我今天想聊的关于技术上的东西:double精度的丢失问题。 1问题复现 我们先举个简单的例子 double result = 1.0 - 0.9; 这段代码中result等于多少?0.1么?如果执行代码的话,分分钟打脸。 double精度丢失问题 2背后原理 无论是我们本文提到的double,还是float,都是浮点数。 在计算机科学中,浮点(英语:floating point,缩写为FP)是一种对于实数的近似值数值表现法,由一个有效数字(即尾数)加上幂数来表示,通常是乘以某个基数的整数次指数得到。以这种表示法表示的数值,称为浮点数(floating-point number)。 计算机使用浮点数运算的主因,在于计算机使用二进位制的运算。 例如:4÷2=2,4=100(二进制)、2=010(二进制)。在二进制中除以2相当于退一位数。 那么1.0÷2=0.5=0.1(二进制)也就是1/2,依此类推二进制的0.01(二进制