1、什么是机器语言?—CPU可以直接识别并使用的语言
什么是内存地址?—内存中用来表示命令和数据存储位置的数值
2、CPU的内部由寄存器、控制器、运算器和时钟四个部分构成,各部分之间由电流信号相互连通。寄存器可用来暂存指令、数据等处理对象,可以将其看作是内存的一种。根据种类的不同,一个CPU内部会有20~100个寄存器。控制器负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整个计算机。运算器负责运算从内存读入寄存器的数据。时钟负责发出CPU开始计时的时钟信号,时钟信号的频率越高,CPU的运行速度越快
3、机器语言和编程语言都是低级语言,编程语言也只有转换为机器语言后才会被CPU认识(这个过程称为汇编)。
4、寄存器种类中的程序计数器存储着下一条指令所在的内存地址,决定着程序的流程(每执行一个指令,程序计数器的值就自动+1,但当程序中存在分支if和循环for,机器语言的指令就可以将程序计数器的值设定为任意的址,而不是+1)
5、32位CPU就是用32位的二进制数来表示数据及地址的数值,所以32位能分配的内存的地址最大为4G,64位的就没问题。
6、CPU会把基址寄存器+变址寄存器的值解释为实际查看的内存地址、变址寄存器的值就相当于高级编程语言程序中数组的索引功能。
7、二进制数当中的四位就可以由十六进制中的一位来表示。所以32位的二进制数就可以用8位的十六进制数来表示。
1、补码形式表示的8位二进制数11111111,用十进制数表示的话是-1.
2、补码形式表示的8位二进制数10101010,用16位的二进制数表示的话是1111111110101010
3、反转部分图形模式时,使用的是XOR(异或^)运算,XOR运算只反转与1相对应的位。NOT(非!)运算是反转所有的位。
4、8位的二进制数被称为一个字节,字节是信息的基本单位
5、十进制数39用8位的二进制数表示是00100111,左移两位后得10011100(左移,空出来的右侧低位补0操作,右移不一样),转换为十进制数就是156,这个例子中我们并没有考虑符号的正负。另外,左右的移位操作某些时候可以代替数值运算的乘除运算
6、二进制数表示正负数,首位是0为正数,首位为1是负数。1的二进制数是00000001,-1的二进制数不是10000001,而是11111111;因为计算机在做减法运算时,内部实际上是在做加法运算,这就牵扯到二进制的补数。-1的二进制数是怎么来的呢,我们拿1的二进制数取反,00000001–>11111110得到,然后拿取反后的结果+1,我们就得到了11111111。_
好,我们验证-1+1=0,11111111+00000001=(1)00000000,1溢出了,溢出的位计算机会忽略掉,后8位的话就是00000000,也就是0了
再比如3-5=-2,转换为二进制8位运算就是(00000011)+(11111011)=11111110,因为结果的最高位是1,证明是负数,
我们需要进行补数运算,全部取反得00000001,再加上1得00000010,转换为十进制也就是2,所以结果就是-2
7、仔细考虑一下补数的机制,java中short的取值范围是-128–+127,为什么负数比正数多一个呢,是因为11111111,最高位是1表示负数,是十进制数的-1,并不是128,因为00000000表示0且首位是0,所以我们在计算机中将0划分到正数的行列了
8、逻辑右移:二进制数的值表示图形模式而非数值模式时,右移后在最高位全部补0;所谓的逻辑元算就是与、或、非、异或
算数右移:右移后,原来是正数就全补0,原来是负数就全补1,(简单来说就是保证原来数值的符号);所谓算数运算就是把二进制进行数学上的数量值运算
1、二进制数0.1用十进制表示的话是0.5,就是2的-1次方
2、计算机中,将0.1加100次无法得到整数10,十进制的0.1无法通过二进制来进行准确的表示,就如同无法用十进制表示3.3333……一样,因为无法完全表示,我们就会用近似来代替,代替就会出现错误。计算机无法处理无限小数
3、使用与实际小数点位置不同的书写方法来表示小数的形式称为浮点数,相对应的就有定点数。浮点数由符号、为数、基数、指数四部分构成。另外双精度浮点数和单精度浮点数在表示同一个数值时使用的位数不同,近似的趋近值也就不同。
4、为了避免出现误差,我们可以用整数来代替小数来参与运算,然后再转换为小数。或者采用(BCD,财务使用不许有误差)
1、高级编程语言中的数据类型指什么:占据内存的大小和存储在该内存区域的数据类型
2、与物理内存有着相同构造的数组的数据类型长度是1个字节(8bit),物理内存是以字节为单位进行数据存储的
3、指针指的是用于存储内存地址的变量
4、java中8个基本数据类型所占用的字节数不同,在读取时所采用的对内存的读取方法也不同,依据各自所占用的字节进行相应的读取,而不是一个字节一个字节的读取,因此就会提高速度
5、指针也是一种变量,它所表示的不是数据的值,而是存储这数据的内存地址。指针的设置不同,每次读取的字节数就不同,比如:char*d; short *e; long *f; 我们相应的读取就是1、2、4个字节一起读取
6、数组是使用内存的基本,我们指定数组的数据类型,那么我们的指针就会按照设置的数据类型所占用的字节数来进行一定个数的读取存入操作,可以使速度提升(数组中是有索引的,索引是从0开始的)
7、队列是一个环状缓冲区。二叉树是指在链表的基础上往数组中追加元素的时候,考虑到数据的大小关系,将其分成左右两个方向的表现形式,小的在左边,大的在右边。
1、Windows中,在程序运行时,存储着可以动态加载调用的函数和数据的文件称为DLL文件
2、计算机的五大部件:输入装置、输出装置、存储器、运算器、控制器
3、DLL文件,是在程序运行时可以动态加载Library(函数和数据的集合)的文件。注意一点的是,多个应用可以共有同一个DLL文件,这样共有可以达到节约内存的效果。Windows操所系统本身也是多个DLL文件的集合体。有时在安装新应用时,DLL文件会被追加。
4、Windows中的.exe的全程是executable(可执行)
5、Windows中的硬盘的扇区也有簇单位,hdfs中有块的单位,应该是差不多的最小存储单元,就算文件达不到那个大小,但是也会占用那么大的空间。不同的扇区不能存储不同的文件,不管文件再小,最起码也会占用一个扇区
1、BMP格式的图片文件是没有被压缩过的,因此比JPEG格式等压缩过的图片大,JPEG使用了非可逆压缩
2、AAAAAABBBBBB压缩可以用“数据 x 重复次数”来进行压缩,也就是A6B6。以上是RLE算法的压缩
3、压缩日本使用的哈夫曼算法(常用的给小字节,不常用的再给大字节,这样整体的体量就会小很多)。在二叉树实现哈夫曼算法的时候,是从树叶生到树根的过程,先统计每个字符出现的频次,然后根据频次来进行二叉树每个节点的整合(每次都选取最小两个频次连接为一个二叉树,最后从根部再找回树叶来进行哈夫曼编码)。
1、API(Application Programming Interface,应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问原码,或理解内部工作机制的细节。
2、java为什么可以跨平台运行:其同其它语言一样,都是将语法记述的源代码编译后运行,不过编译后生成的并不是特定CPU使用的本地代码,而是名为字节代码的程序。字节代码的运行环境就是java虚拟机,java虚拟机才是把字节代码转化为本地代码交个CPU一行行运行的。这既是好处,也是运行速度相对慢的痛点。
3、BIOS(basic input/output system)和引导(bootstrap),BIOS存在于ROM上,
1、CPU只可以解析和运行本地代码,也就是机器语言,.obj为后缀
2、即使是不同编程语言编写的代码,转换(各语言编译器负责)成本地代码后,也都会变成同一种语言,也就是机器语言
3、垃圾回收机制指的是:对处理完毕后不再需要的堆内存空间的数据和对象进行清理,释放它们所占用的内存空间,以免发生内存泄漏(堆内存一直被占用),java中的垃圾回收是自动的,C和C++是手动的
1、GUI是用户图形界面的缩写
2、网络功能和数据库功能,虽然并不是操作系统本身不可欠缺的功能,但因为它们和操作系统很接近,所以被统称为中间件,而不是称作应用。意思是在处于操作系统和应用的中间。操作系统和中间件合在一起称为系统软件。
3、windows可以看成是多种应用的集合体,驱动硬件,给予用户基本的输入输出等功能。
1、汇编语言通常是.asm(assembler汇编器)后缀结尾的
2、汇编语言区别于机器语言,是在机器语言的基础上添加了助记符(比如add),汇编语言的源代码和本地代码是一一对应的,汇编和反汇编,反汇编未必和源代码一一对应。
3、C语言中,在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量。全局变量可以在源代码的任意部分被引用,局部变量只能在定义该变量的函数内进行引用。
4、线程是操作系统分配给CPU的最小运行单位。源代码的一个函数就相当于一个线程。多线程处理指的是在一个程序中同时运行多个函数的意思。在多线程处理中,用汇编语言记述的代码每运行1行,处理都有可能切换到其他线程中,所以有了(脏度等_)
1、BIOS位于计算机主板或者扩展板卡上内置的ROM中,里面记录了用来控制外围设备的程序和数据。
1、伪随机数同真正的随机数不同,具有周期性。借助工具来产生的随机数具有一定的规律性,随机数也是借助某种算法来实现的
2、随机数确定猜拳的每个的概率,我们可以%10来给剪子包袱锤分配不同的if else来达到不同的概率
为什么要源码编译:
一般来说,我们软件的安装方式有yum(rpm),和源码编译两种方式,那么为什么我们需要源码编译安装一部分软件?选择源码编译安装软件有以下几个原因:
1:满足不同的运行平台,我们Linux发型版本众多,但是每个版本采用的软件或者内核版本都不一样,而我们的二进制包所依赖的环境不一定能够正常运行,所以大部分软件直接提供源码!
2:方便定制,满足不同的需求,很多时候我们所需要的软件都是可以定制的,我需要什么就安装什么,大多数二进制代码都是一键装全,所以自由度并不高!
3:方便运维、开发人员维护,我们的源码是可以打包二进制的,但是对于这个软件的打包都会有一份代价不小的额外工作,包括维护,所以如果是源码的话,软件产商会直接维护,但是如果是二进制的话,一般都是Linux发行商提供
class PassByValueExample {
public static void main(String[] args) {
Dog dog = new Dog("A");
func(dog);
System.out.println(dog.getName()); // B
}
private static void func(Dog dog) {
dog.setName("B");
}
}