符号计算

计算机中数相加(相减)的溢出原因详细解释

匿名 (未验证) 提交于 2019-12-03 00:34:01
这个问题可能困惑很多初学者,之前网上的解释也大都比较简单,我来整理一份全面详细的解答 1,首先你要明白,计算机中的符号数有三种表示方法,即 原码 、 反码 和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理。 同时,加法和减法也可以统一处理 (这里可以参考 点击打开链接 ,里面有解释补码怎么写)。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。 2,明白了计算机中数是以补码形式存在后,我们举例分析,比如我int a,分配给a八位二进制,因为要留一位做符号位(正负号),所以a能表示的数的范围(补码的形式)(实际上正数补码是其本身,负数补码是在原码(也就是二进制表示其正数的基础上符号位不变取反加一)是-2^(8-1)~ 2^(8-1)-1),之所以负数比正数范围大一,是因为补码中的符号位即表示符号,也可以表示数值如1000,0000(补码)表示-128,这是指在表示端点值的时候符号位才有双重含义。 3,这里举个负数补码计算的例子,分配八位计算-5-4=-9,首先-4的补码,先算4的原码0000,0100,取反加一1111,1100,同理-5补码1111,1011两个补码相加得1,1111

SystemVerilog语言简介

匿名 (未验证) 提交于 2019-12-03 00:25:02
SystemVerilog是一种 硬件描述和验证语言 (HDVL),它 基于IEEE1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了数据类型、结构、压缩和非压缩数组、 接口、断言等等 ,这些都使得 SystemVerilog在一个更高的抽象层次上提高了设计建模的能力 。SystemVerilog由Accellera开发,它 主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力 。下面我们从几个方面对SystemVerilog所作的增强进行简要的介绍,期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。 1. 接口(Interface) Verilog模块之间的连接是通过模块端口进行的。为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。不幸的是,在设计的早期,我们很难把握设计的细节。而且,一旦模块的端口定义完成后,我们也很难改变端口的配置。另外,一个设计中的许多模块往往具有相同的端口定义,在Verilog中,我们必须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。 SystemVerilog提供了一个新的、高层抽象的模块连接,这个连接被称为 接口( Interface ) 。接口在关键字 interface 和 endinterface 之间定义,它独立于模块

JVM类加载机制

匿名 (未验证) 提交于 2019-12-03 00:22:01
概述 拟 机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。与那些在编译时需要进行连接工作的语言不同,在Java中,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是为Java应用程序提供了高度的灵活性。 类加载的时机 其中加载、验证、准备、初始化、卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地 开始 ,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称动态绑定或晚期绑定)。注意这里写的是按部就班地“开始”,而不是“进行”或“完成”,强调这点是因为这些阶段通常是相互交叉地混合式进行的,通常在一个阶段执行的过程中调用、激活另外一个阶段。 主动引用 。除此之外所有引用类的方式都不会触发初始化,称为 被动引用 。下面是几个被动引用的代码示例 public class SuperClass { /** * 被动引用示例一: * 通过子类引用父类的静态字段,不会导致子类的初始化 */ static{ System.out.println("SuperClass init"); } public static int value = 123; } public

c++ 实现四则运算

匿名 (未验证) 提交于 2019-12-02 23:59:01
描述:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 输出:计算结果,保留两位小数。 程序任务分为两部分: 一。将输入的中缀表达式转换为后缀表达式,实现过程:   1.准备队列保存后缀表达式(计算后缀表达式时,需要从队首读取数据)     准备栈保存计算符,使用找调整计算顺序       2.读输入字符串,如果是数字,直接入后缀表达式队列;     如果是计算符号,当计算符号栈为空或当前符号优先级大于栈顶符号优先级,直接入栈。否则依次弹出栈顶符号入后缀表达式队列。     如果是(直接入栈,如果是)弹出符号栈中符号入后缀表达式队列,直到((不入队)   3.反复2过程直到读完所有字符串,若符号栈不为空,弹出其中所有元素入队 二。计算后缀表达式:   计算栈   1.弹出队列元素,如果是数字,直接入栈,如果是操作符号,弹出栈顶两个数字计算。 P.S.第一个弹出数字是第二个数字,第二个弹出数字是第一个数字。     |--------|     |temp2|     |--------| 来源:博客园 作者: 水中飞云 链接:https://www.cnblogs.com/a-cloud---/p/11483901.html

C++11学习笔记(1)

匿名 (未验证) 提交于 2019-12-02 23:52:01
注:本人所有学习笔记多来自各种书籍原著,C++11学习笔记根据《C++Primer (第五版)》整理,仅供个人复习使用。 #include<iostream> int main() { int sum = 0, value = 0; //读取数据直到遇到文件尾 while(std::cin >> value) sum += value; std::cout<<"Sum is:"<<sum<<std::endl; return 0; } 我们可以将istream对象作为判断条件来判断输入是否结束。当使用一个istream对象作为条件时,其效果时检查流的状态。如果流是有效的,即流未遇到错误(遇到文件结束符或遇到无效输入),那么检测成功。而处于无效状态的istream对象会使条件变为假。 PS:当从键盘向程序输入数据时,对于如何指出文件结束,不同的操作系统有不同的约定。在Windows系统中,输入文件结束符的方法时Ctrl+Z,然后按Enter或Return键。在Unix系统中,包括Mac OS X系统中,文件结束符输入是用Ctrl+D。 2.使用文件重定向 测试程序可以使用操作系统提供的文件重定向功能,这种机制允许我们将标准输入和标准输出与命名文件关联,格式如下: $ 可执行文件名<输入文件名> 输出文件名 PS:Windows系统需要带文件名后缀,Linux不需要。 3.C+

虎书_褚论

匿名 (未验证) 提交于 2019-12-02 23:47:01
对于任何大型软件系统,如果设计者注意到该系统的基本抽象和接口,那么对这个系统的实现和理解就要容易的多。 下图,展示了一个典型的编译器的各个阶段,每个阶段由一至多个软件模块来实现。将编译器分解成这样多个阶段是为了能够重用他的各种构件。例如,要改变此编译器所生成的机器语言的目标机时,只要改变栈帧布局模块和指令选择模块。当要改变被编译的源语言的时候,只需要改变翻译模块之前的模块就可以了,该编译器也可以在抽象语法接口处与面向语言的语法编辑器相连。 抽象语法、IR树、汇编之类的接口是数据结构的形式,例如语法分析动作阶段建立抽象语法数据结构,并将它传递给语义分析阶段。另一些接口是抽象数据类型:翻译接口是一组可由语义分析阶段调用的函数;单词符号接口是函数形式,分析器通过调用它而得到输入程序中下一个单词符号。 阶段 描述 词法分析 将原文件分解成一个个独立的单词符号 语法分析 分析程序的短语结构 语义动作 建立每个短语对应的抽象语法树 语义分析 确定每个短语的含义,建立变量和其声明的关联。检查每个表达式的类型,翻译每个短语 栈帧布局 按机器要求的方式将变量、函数参数等分配于活跃记录 翻译 生成中间表示树(IR树)这是一种与任意特定程序设计语言和目标机体系结构无关的表示 规范化 提取表达式中的副作用,整理条件分支,方便下一阶段的处理 指令选择 将IR树节点组合成,与目标机指令动作相对应的块

MySQL 军规

早过忘川 提交于 2019-12-02 23:29:13
MySQL 基础篇 三范式 MySQL 军规 MySQL 配置 MySQL 用户管理和权限设置 MySQL 常用函数介绍 MySQL 字段类型介绍 MySQL 多列排序 MySQL 行转列 列转行 MySQL NULL 使用带来的坑 MySQL AND 和 OR 联合使用带来的坑 MySQL 触发器的使用 转载: 《58到家数据库30条军规解读》 《赶集mysql军规》 《58到家MySQL军规升级版》 基础规范 必须使用 InnoDB 存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高。 表字符集默认使用 utf8 ,必要时候使用 utf8mb4 解读:万国码,无需转码,无乱码风险,节省空间,utf8mb4 是 utf8 的超集,有存储4字节例如表情符号时,使用它。 数据表、数据字段必须加入中文注释 禁止使用存储过程、视图、触发器、Event 解读:高并发大数据的互联网业务,架构设计思路是“解放数据库 CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,CPU 计算还是上移吧。 禁止存储大文件或者大照片 解读:为何要让数据库做它不擅长的事情?大文件和照片存储在文件系统,数据库里存 URI 多好。 控制单表数据量

算法设计与分析——符号三角形问题(回溯法)

こ雲淡風輕ζ 提交于 2019-12-02 23:14:26
一、问题描述 下图所示的三角形中,有14个“+“和14个“-”。2个同号下面是+,两个异号下面是-。 在一般情况下,符号三角形的第一行有n个符号。符号三角形问题,要求 对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”相同。 二、算法分析 用n元组x[1:n]表示符号三角形的第一行的n个符号,当x[i]等于1时,表示符号三角形的第一行的第i个符号为“+”;当x[i]等于0时,表示符号三角形的第一行的第i个符号为“-”;1<=i<=n。由于x[i]是2值的。所以在用回溯法解符号三角形问题时,可以用一棵完全二叉树来表示其解空间。在符号三角形的第一行的前i个符号x[1:i]确定后,就确定了一个有i*(i+1)/2个符号组成的符号三角形。 (i*(i+1)/2来自首项为1、公差为1的等差数列的求和公式) 下一步确定x[i+1]的值后,只要在前面已确定的符号三角形的右边加一条边,就可以拓展为x[1:i+1]所对应的符号三角形。最终由x[1:n]所确定的符号三角形包含的“+”个数与“-”同为 n(n+1)/4(n(n+1)/2的一半,也就是一半的符号) 。因此,在回溯可将“+”、“-”个数均 不超过n(n+1)/4为约束条件。同时,对于给定的n当n(n+1)/2为奇数时,显然不存在“+”和“-”个数相同的符号三角形。 这里举一个第1行是4个字符的符号三角形的子集树

BGP基础

匿名 (未验证) 提交于 2019-12-02 23:05:13
BGP基础 5.1 BG[基础 2个字节AS号:1----65535 BGP报文交互中分为Speaker和Peer两种角色 5.2 BGP报文类型及格式 报文格式 BGP报文由BGP报文头和具体报文内容两部分组成。(RFC4271) BGP的运行是通过消息驱动的,共有5种消息类型,这些消息有相同的报文头。这些消息通过TCP协议进行传播(端口号是179)。消息最长为4096字节,最短为19字节(只包含报文头)。 BGP报文头包括三的部分,总长19字节。各个部分的格式和功能如下:(RFC4271) ͼ1 Marker : 占16字节,用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1(十六进制则全“FF”)。 Length : 占2个字节(无符号位),BGP消息总长度(包括报文头在内),以字节为单位。长度范围是19~4096。 Type : 占1个字节(无符号位),BGP消息的类型。Type有5个可选值,表示BGP报文头后面所接的5类报文(其中,前四种消息是在RFC4271中定义的,而Type5的消息则是在RFC2918中定义的): TYPE ֵ 报文类型 1 OPEN 2 UPDATE 3 NOTIFICATION 4 KEEPALIVE 5 REFRESH(RFC2918) 如果BGP报文头中的TYPE为1,则该报文为OPEN报文

原码, 反码, 补码 详解

坚强是说给别人听的谎言 提交于 2019-12-02 22:14:11
https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 原码, 反码, 补码 详解 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 =