符号计算

原码、补码和反码

萝らか妹 提交于 2019-11-29 15:13:55
数在计算机中是以二进制形式表示的。 数分为有符号数和无符号数。 原码、反码、补码都是有符号定点数的表示方法。 一个有符号定点数的最高位为符号位,0是正,1是副。 以下都以8位整数为例, 原码就是这个数本身的二进制形式。 例如 0000001 就是+1 1000001 就是-1 正数的反码和补码都是和原码相同。 负数的反码是将其原码除符号位之外的各位求反 [-3]反=[10000011]反=11111100 负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。 [-3]补=[10000011]补=11111101 一个数和它的补码是可逆的。 为什么要设立补码呢? 第一是为了能让计算机执行减法: [a-b]补=a补+(-b)补 第二个原因是为了统一正0和负0 正零:00000000 负零:10000000 这两个数其实都是0,但他们的原码却有不同的表示。 但是他们的补码是一样的,都是00000000 特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!) [10000000]补 =[10000000]反+1 =11111111+1 =(1)00000000 =00000000(最高位溢出了,符号位变成了0) 有人会问 10000000这个补码表示的哪个数的补码呢? 其实这是一个规定,这个数表示的是-128 所以n位补码能表示的范围是 -2^(n-1

数值数据在计算机中的存储

蓝咒 提交于 2019-11-29 14:41:35
参考: MOOC-袁春风:计算机系统基础(一) 第二周 定点数与浮点数 整数、浮点数在计算机中的存储 一般数值数据包括 整数 和 实数 。数值数据在计算机中表示主要关心三个方面:进位计数制、定/浮点表示、二进制编码。 进位计数制: 十进制:0, 1, 2, 3, 4, 5, 6, 7, 8, 9 二进制:0, 1 八进制:0, 1, 2, 3, 4, 5, 6, 7 十六进制:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F 进制转换(R进制):整数部分,除R取余,上右下左;小数部分,乘R取整,上左下右。 简便方法: 835=512+256+64+2+1=>1101000011 0.6875=0.5+0.125+0.0625=>0.1011(小数点在计算机中如何表示) 定、浮点表示(解决 小数点 问题) 定点数 :约定机器中所有数据的小数点位置固定不变,通常将定点数表示成纯小数(小数点固定在数值部分的最高位之前)或纯整数(小数点固定在数值部分的最后面)。 定点小数 用来表示浮点数的尾数部分; 定点整数 用来表示整数。整数又分为 带符号整数 和 无符号整数 。有无符号位决定了数值的表示范围。 浮点数 :利用指数达到浮动小数点的效果,将实数X表示为 \(X=(-1)^s \times M \times R^E\) 。S取0或1,决定X的 符号

游戏开发面试总结1

筅森魡賤 提交于 2019-11-29 10:24:09
秋招第一次面试,凉的透透的,面试还死机了。。 记录一下吧 1:Unicode和UTF-8的区别 Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号,每个符号的编码都不一样。 Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。 UTF-8是目前使用最广的一种Unicode的实现方式。它最大的特点就是变长编码的方式,采用了1~4个子节来表示一个符号,根据不同的符号而变化字节长度。 UTF-8的规则: (1) : 对于单字节的符号,字节的第一位设置为0,后面7位位这个符号的Unicode编码。因此对于英文字母,UTF-8和ASCII码是一样的。 (2) : 对于n字节的符号,第一个字节的前N位设置为1,第n+1位设置为0,后面字节的前两位一律设置为10。剩下的没有提及的二进制位全部设置为这个符号的Unicode 所以总结来说,UTF-8便阿门就是如果一个字节的第一位位0,则这个字节单独就是一个祖父,如果是1,那么连续多少个1就表示它占用了多少个字节。 2:unity的静态合批和动态合批 静态合批:在场景里面有有一些共享同一材质的模型存在,并且这些模型都一直不会移动,旋转和缩放那么就设置这些模型为static。 在build的时候,unity会将这些共享材质的静态模型的vertex buffer和index buffer

unsigned int 和 int

最后都变了- 提交于 2019-11-29 09:22:02
就如同int a;一样,int 也能被其它的修饰符修饰。除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种: 1.signed----有符号,可修饰char、int。Int是默认有符号的。 2.unsigned-----无符号,修饰int 、char 3.long------长型,修饰int 、double 4.short------短型,修饰int 我们主要来看一下signed和unsigned与int之间的联系与区别。 什么叫做有符号,什么叫做无符号 这个问题其实很简单,比如:5和-5,5没有符号,-5有符号。简单吧。但是在计算机中的这种符号可不简单。我们分别来看一下: 在说明有符号和无符号的区别之前,我们必须先知道溢出是怎么回事,因为有无符号的根本原因可以说就是因为数据出现了溢出现象导致的。 溢出: 我们知道数据在计算机中以二进制存储,并且占据一定的空间,而这个空间属于计算机分配的空间。 计算机给int分配32位或者16位(不同电脑可能不同)的空间,既然空间有限,那么数值就会有限制,就会存在最大值与最小值这一说,比如:假设int类型的分配16位,无符号类型的最大值为1111 1111 1111 1111(16个1),也就是65535,如果超过了65535,这就叫做溢出,那该怎么办? 如果要输出65536,那将会输出个什么东西呢?

Java基本数据类型及其运算

橙三吉。 提交于 2019-11-29 06:41:05
Java基本数据类型及其运算 1. 整型运算 四则运算 对于整型类型,Java只定义了带符号的整型,因此,最高位的bit表示符号位(0表示正数,1表示负数)。各种整型能表示的最大范围如下: byte:-128 ~ 127 short: -32768 ~ 32767 int: -2147483648 ~ 2147483647 long: -9223372036854775808 ~ 9223372036854775807 因此存在溢出情况,求解溢出情况只需要将具体的数换为二进制进行加减即可,如果最高位变为1,则溢出之后的数又会变为负数 注:没有必要为了节省内存而使用byte和short进行整数运算,范围太小,即使确定了在byte类型内,后期的各种与int的转换会使代码十分冗余,难以维护 int i = 0 while ( i > 0 ) { //不是死循环,因为会溢出变为负数 i += 1000 ; } 移位运算 在计算机种整数总是以2进制的形式存在 //左移,包括符号位向左截断相应的位数,而右边用0补上 int shitNum = 15 ; //00000000 00000000 00000000 00001111 int shitNumLeft1 = shitNum << 1 ; //00000000 00000000 00000000 00011110 System . out

关于整数型溢出的一些思考【转载】

こ雲淡風輕ζ 提交于 2019-11-29 01:39:36
课程简介 我们之前所研究的漏洞,都是非常经典的栈溢出漏洞,也是最为常见的漏洞形态。但是我们对于缓冲区溢出的学习,是不能够仅仅局限在这类的漏洞里面的,其实还有一些比较少见,但却值得我们注意的漏洞形式,是需要我们进行研究的。在接下来的几次课程中,就对这些漏洞逐一进行分析。而我这次所讲的,是整数溢出的漏洞。 课程介绍 实验环境: 操作机: Windows XP 实验工具: Tools Path Visual C++ 桌面 OllyDbg C:\Tools\OllyICE 实验文件: IntOverflow.exe OverflowTest.exe overflow.c zhengshuyichu.c 将自己的 ShellCode 代码植入存在整数溢出的程序中。 实验步骤 ​ ​ 第一步 下载实验工具 请访问 http://tools.ichunqiu.com/d4353896 下载 实验文件 。 小 i 提示 : 在本次实验中 , 请注意实验工具、实验文件存放路径 , 不同的文件路径可能会出现不一样的实验结果。 在实验环境中无法连接互联网,请使用您本地的网络环境。 快速查找实验工具 打开桌面 Everything 搜索工具,输入实验工具名称,右击选择“打开路径”,跳转实验工 具所在位置。 以查找 BURP 为例为大家演示。 ​ ​ ​ ​ 第二步 什么是整数溢出 在计算机中,整数分为

【C/C++】复合类型(自定义类型)

杀马特。学长 韩版系。学妹 提交于 2019-11-29 00:50:57
gcc编译器 gcc(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译器。gcc原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,gcc同样适用于微软的Windows。 gcc最初用于编译C语言,随着项目的发展gcc已经成为了能够编译C、C++、Java、Ada、fortran、Object C、Object C++、Go语言的编译器大家族。 编译命令格式: gcc [-option1] ... <filename> g++ [-option1] ... <filename> 1 2 命令、选项和源文件之间使用空格分隔 一行命令中可以有零个、一个或多个选项 文件名可以包含文件的绝对路径,也可以使用相对路径 如果命令中不包含输出可执行文件的文件名,可执行文件的文件名会自动生成一个默认名,Linux平台为a.out,Windows平台为a.exe gcc、g++编译常用选项说明: 选项 含义 -o file 指定生成的输出文件名为file -E 只进行预处理 -S(大写) 只进行预处理和编译 -c(小写) 只进行预处理、编译和汇编 C语言是不跨平台的,用Java用习惯的我突然回到C,有点不适应,用SpringBoot完成的Java项目,打成jar包

数据库操作(一)

萝らか妹 提交于 2019-11-29 00:49:12
数据库操作(一) 1.库操作 数据库命名规则: 由字母、数字和下划线组成; 大小写区分; 唯一性; 不能使用关键字; 最长128位; 不能单独使用数字. 库相关操作 查看数据库: show databases; show create database db1; select database(); #查看当前所在的库 选择数据库: use db1 增: create database db1 charset utf8; 改: alter database db1 charset gbk; 删: drop database db1; 2.表操作 表相关操作 先切换到文件夹下: use db1 增: create table t1(id int,name char(10)); create table 表名(字段名1 类型[(宽度) 约束条件],字段名2 类型[(宽度) 约束条件]); 查: show tables; #查看所有表 desc t1; #查看表结构 show create table t1; #查看表详细结构 改: alter table t1 modify name char(3); alter table t1 change name name1; 删: drop table t1; 注意: 1.在同一张表中,字段名不能相同 2.宽度和约束类型可选 3

Jvm之class文件的加载、初始化

自作多情 提交于 2019-11-28 22:32:13
编写的java文件在要真正运行时,会首先被编译成 “.class"结尾的二进制文件,然后被虚拟机加载。那么在虚拟机中一个class文件要成为java实例,需要经历好几个步骤: 一、class文件要成为java实例的步骤 1、装载:装载阶段由三个基本动作完成,要装载一个类型,java虚拟机必须: (1)通过该类型的完全限定名,产生一个代表该类型的二进制数据流 (2)解析这个二进制数据流为方法区内的内部数据结构 (3)创建一个表示该类型的java.lang.Class的实例 *当时用new关键字创建一个对象时,该类的数据结构存放在方法区中,new出的对象存放在堆中 二进制的数据流可由以下方式产生: 1、从本地加载一个java class 文件 2、通过网络上下载一个class文件 3、从一个zip、jar、或者其他文档中提取class文件 等… 2、验证:类被装载后,就要准备连接,连接的第一步是验证——确认类型符合java语言规范,并且不会危及虚拟机的完整性。 类型的检查——确保除了Object之外的每个类都必须有一个超类,并确保该类的所有超类都已经被装载了 类之间的二进制兼容检查——检查final类不能用于子类、检查final类的方法不能被覆盖、确保子类和超类之间没有不兼容的方法 ——检查所有的常量池入口相互之间一致 ——检查常量池中的所有特殊字符串是否符合格式 —

Jvm之class文件的加载、初始化

烂漫一生 提交于 2019-11-28 22:30:58
编写的 java 文件在要真正运行时,会首先被编译成 “ .class" 结尾的二进制文件,然后被虚拟机加载。那么在虚拟机中一个 class 文件要成为 java 实例,需要经历好几个步骤: 一、 class 文件要成为 java 实例 的步骤 1 、装载:装载阶段由三个基本动作完成,要装载一个类型, java 虚拟机必须: ( 1 )通过该类型的完全限定名,产生一个代表该类型的二进制数据流 ( 2 )解析这个二进制数据流为方法区内的内部数据结构 ( 3 )创建一个表示该类型的 java.lang.Class 的实例 *** 当时用 new 关键字创建一个对象时,该类的数据结构存放在方法区中, new 出的对象存放在堆中 二进制的数据流可由以下方式产生: 1 、从本地加载一个 java class 文件 2 、通过网络上下载一个 class 文件 3 、从一个 zip 、 jar 、或者其他文档中提取 class 文件 等… 2 、验证:类被装载后,就要准备连接,连接的第一步是验证——确认类型符合 java 语言规范,并且不会危及虚拟机的完整性。 类型的检查 ——确保除了 Object 之外的每个类都必须有一个超类,并确保该类的所有超类都已经被装载了 类之间的二进制兼容检查 ——检查 final 类不能用于子类、检查 final 类的方法不能被覆盖