01
前言
学习Java之前,我想问一个问题,你们觉得有没有必要学习计算机基础?
初识编程,刚开始很多人觉得没有必要看这些枯燥无味的基础知识,不如直接从“HelloWorld”开始,先接触程序,让代码编译运行起来,才渐渐的去深入学习程序的语法,框架的结构等;后续使用类似于Spring框架去整合程序、搭建项目。
我并不是否定这样的学习方式,因为:
每个同学的体质不一样
,这种方式对于自制力强,学习能力高的人来说比较适用,尤其是想要快速入门和着急找工作的同学,要学会如何去使用它,至于底层涉及到的原理,可慢慢深入了解,毕竟:入行成为一名资深程序员可是一辈子的事情。
但对于大对数0基础开始学习的同学,我个人依旧是建议从计算机基础小知识点开始逐步深入,熟悉编程思想,了解底层逻辑,这样对以后学习将非常有帮助。
初步认识计算机
接下来,让我们花费几分钟的时间来简单了解下计算机的一些基础知识。
02
一:机器语言的分类
机器语言
问
机器语言是什么?
机器语言是一种用于编程计算机的低级语言,它直接与计算机硬件进行交互。机器语言是计算机能够理解和执行的最基本形式的指令集。它以二进制代码的形式表示,每个指令由一串数字组成,用于指示计算机在内部执行的特定操作。例如下面就是一串简单的机器码:
010100100000 // 520
那么就会有人问,为什么机器码是0和1组成的?
机器码(Machine Code)是计算机能够直接理解和执行的指令集,它使用0和1组成的二进制编码进行表示。这是因为计算机内部的电路和存储器是由许多开关组成的,这些开关只有两个状态:打开和关闭,即表示为0和1。
汇编语言
问
汇编语言是什么?
汇编语言是一种与机器语言密切相关的低级程序设计语言。它使用助记符(Mnemonic)和符号标识,使程序员能够更容易地编写和阅读与机器指令直接对应的程序。
汇编语言的语法相对简单,通常由标签(Label)、指令(Instruction)和操作数组成。标签是程序中的一个位置,用于标识特定的指令或数据。指令是具体的机器指令助记符,表示要执行的操作,而操作数提供了指令所需的数据或地址。它与机器语言的区别在于指令的表示方法上,汇编语言的主体是汇编指令,相比于机器指令,编程人员更容易记住。
MOV AX,1234H //汇编指令: 寄存器AX的内容送到1234H中101110000011010000010010 //机器指令
高级语言
问
高级语言是什么?
常见的高级编程语言包括C、C++、Java、Python、PHP、JavaScript等。每种高级语言都有自己的语法和语义规则,以及适用于不同应用领域的特性和库。开发人员可以使用高级语言编写应用程序、网站、算法、游戏和各种软件等。
高级语言通常更易学习和使用,同时提供了更高程度的抽象和功能,使开发人员能够更快速、更高效地编写复杂的程序。列举不同语言的输出:
printf("hello world!"); //C语言
println("hello world!"); //Java
print("hello world!"); //Python
cout<<"hello world!"<<endl; //C++
高级语言的编写的程序需要经过编译器或解释器的处理,将其转换为机器码或者执行解释执行,以便计算机能够理解和执行。这种中间步骤使得高级语言程序在不同的平台上可以保持可移植性,并且能够更方便地进行调试和修改。
提供了更高级的抽象和功能,简化了程序员的编程工作,并提高了代码的可读性、可维护性和可重用性。通过使用编译器或解释器,高级语言程序可以被转换为机器码或解释执行,以便计算机能够理解和执行。
03
二:进制
初识进制,推荐同学们使用在线工具进行进制转换:
https://tool.oschina.net/hexconvert/
二进制
二进制是一种表示数字、文本和数据的计算机编码系统。它是一种基于2个数字的系统,这两个数字是0和1,也被称为位(bit)。在二进制系统中,每个位(bit)代表一个二进制数字,它可以是0或1。
二进制是计算机内部的基本表示形式,计算机中的所有数据都以二进制形式存储和处理。在计算机内部,一连串的二进制位可以表示数字、字符、图像、音频或任何其他形式的数据。
二进制的基数是2,所以每位的权值是2的幂。二进制数字从右到左,每一位的权值依次为1、2、4、8、16、32等等,依次类推。例如,二进制数 1010 表示 1(2^3) + 0(2^2) + 1(2^1) + 0(2^0),等于10。
八进制
由1到7组成的数字串,数字最大不会超过7,逢八进一,例如 157(表示十进制数字111)
十进制
日常使用的数字都是十进制类型的,逢十进一,例如 0123456789。
十六进制
由1到9,a-f(或者是A-F,分别代表10-15)组成的数字串,数字最大不会超过15,其中字母是不区分大小写的,逢十六进一,例如0F83(表示十进制数3971)
进制转换:
A0 * K^0 + A1 * K^1....+ An * K^n //K^n表示K的n次方
二进制数:10101 转换成 十进制数为:21
1*2^4 + 0*2^3 + 1*2^2 + 0*2^1+1*2^0 = 21
2.十进制与k进制的转换:
举个栗子:
用十进制数21一直除以2,每次得到的余数倒数就是最后的二进制数10101。同样,十进制转八进制、十进制转十六进制都是一样的套路,非常简单。
3. 二进制与八进制和十六进制之间的转换:
8是2的3次方,16是2的4次方,所以这之间的转换存在一种快捷方法。以2转8示例,将2进制从低位到高位,每3个一组,如果是十六进制就每4个一组,高位不足3位的补0,然后将每组依次转换成对应的十进制,得到的结果就是对应的8进制或者16进制。
二进制10101100101转八进制:2545
二进制10101100101转十六进制:565
04
三:原码、反码、补码
在计算机中,最小的单位是位,也称为比特(bit)。而另一个常用单位是字节,一个字节是8位,也就是8比特,所以我们常用的二进制表示法是8位。
接下来我们一一解答:
问
原码(Sign-Magnitude):
答
原码是最直观和简单的表示符号的方法。在原码表示中,用最高位表示符号位,0表示正数,1表示负数,其余位表示数值的绝对值。例如,+5的8位原码是:00000101,-5的8位原码是:10000101。
原码的优点是表示符号直观简单,但它的缺点是在进行负数的运算时不方便,因为需要对正负数的运算分别处理。
举个栗子:
0000 0001 // 表示 11000 0001 // 表示 -1
问
反码(One’s Complement):
答
不知道大家有没有注意到原码的一个问题,那就是负数参与计算的时候,比如
出现了一个大问题,就是1 + (-1) 不等于0,而等于 -2。
为了解决原码运算的问题,反码表示方法被引入。在反码中,正数的反码与其原码相同,负数的表示方式为将该数的原码除符号位外的各位取反。例如,+5的8位反码是:00000101,-5的8位反码是:11111010。
原码转反码的规则为:正数的反码为其本身,负数的反码是符号位不变,其他位取反。取反的规则就是如果是0就变成1,如果是1就变成0。
那么将转成反码的计算:
得到的结果是1111 1111。
哎?等等......这不对啊,有同学会问:老师这怎么不是0?
别急,这只是反码的计算结果,将反码转成原码 1111 1111 —> 1000 0000,得到 -0, 也就是0,完全符合预期的结果,也解决了原码的计算问题。但是没有解决0和-0的关系。
这时候要引申出补码辣!!!
同学:尊嘟假嘟?
我:听我给您一一道来
问
补码(Two’s Complement):
答
反码解决了负数计算的问题,但又有新的问题出现了,那就是 -0 和 0。为了解决反码表示中0的问题,补码表示方法被引入。在补码中,正数的补码与其原码相同,负数的表示方式为将该数的反码加1。
例如,+5的8位补码是:00000101,-5的8位补码是:11111011。
举个栗子:
原码:0000 0001 , 补码:0000 0001
原码:1000 0001 , 补码:1111 1111
咱们看图说话:
利用补码计算我们得到了 0 (而不是 -0 ),解决了少一个数字的问题。
在补码中,规定了0的表示为0000 0000,而1000 0000表示的为-128。
注意事项:
原码、反码和补码之间的关系:
若您喜欢这篇文章,欢迎转载分享,非常感谢您的阅读,我将保持初心,持续输出更加实用精彩的文章。
希望大家可以多多关注我哦!