C语言学习-- 计算机原理及二进制

(0x01)CPU组成
  • 寄存器:(累加,标志【逻辑判断】, 基址【imagebase】,变址【基址寄存器的相对位置】,程序,计数【下一条指令在程序中的位置】,指令【cpu内部使用】,栈【记录栈的地址】 )
  • 控制器(主要负责控制,控制每条指令的运行)
  • 运算器(计算机中执行各种算术和逻辑运算操作的部件)
  • 时钟(时钟频率与CPU的性能成正比)
程序与CPU:代码->EXE->加载->CPU
低级语言->机器语言->汇编->c++\java\python

乱码:是因为各种原因(主要是网络传播异常)导致代码或者数据变乱,如1234编程1324。

程序是什么?
为实现某种功能而用计算机语言编写的命令集合。

程序由什么组成?
算法,数据

什么是机器语言?
直接用二进制代码表示的语言,全是0和1。

运行中的程序储存在什么位置?
内存中。

什么是内存地址?
计算机为程序分配的内存空间的编号。
(系统RAM中的特定位置,通常以十六进制的数字表示,如同计算机内部特定位置的编号)

解释和运行程序指令的的计算机部件叫什么?
  控制器。

32位是几个字节?
4字节

(0x02) 二进制的运算
为什么要引入反码与补码?
计算机只懂加法不懂减法,在做运算的时候要将减法转换成加上一个负数(负数->反码->补码)。
原码、补码与反码 
   正数的补码和反码都是其本身;
   负数的反码是除了符号位其余位数取反,负数的补码是其反码再加1.
左移与右移
   逻辑右移是不考虑符号位,算数右移是需要考虑符号位。
  左移就是: 丢弃最高位,0补最低位
  右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变、
  就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移。
当移动的位数超过类型的长度时,会取余数,然后移动余数个位。
     负数10100110 >>5(假设字长为8位),则得到的是  11111101
 
 总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.

浮点数 :在计算的时候将其换成整数,在输出的时候再换成浮点数。

01011100对于的十进制是多少?
  5C(H)  ->  92

00001111左移两位结果是多少?由什么规律?
 00111100,最左边去掉两位,右边补0

以补码形式表示的8位二进制数1111 1111,十进制为多少?
  1111 1111的反码是:1000 0000,补码为:10000001

二进制和十进制有什么区别?
    二进制全是0和1组成,十进制是由0~9十个数字组成。

0-16的二进制,再转换十进制
00000 (0),00001(1),00010(2),00011(3),00100(4),00101(5),00110(6),00111(7),01000(8),01001(9),01010(10),01011(11),01100(12),01101(13),01110(14),01111(15),10000(16)

计算:
   0010011         
+ 0010011       
-------------
= 0100110

     0011101
+  0000011
--------------
=   0100000

  0100111001
- 0001110000
--------------------
   0011001001

0100111001-0001110000 ==0100111001+(-0001110000)==0100111001+(100001010)==011010000

1110011001000逻辑右移3位,算术右移3位(都用二进制表示)。
逻辑右移:0001110011001
算术右移:1111110011001



你可能感兴趣的:(C语言)