微型计算机原理之进制变换

92 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

一、常见概念

  • 常量:在程序运行过程中,其值不能发生改变的量,称为常量;

    通常情况下,定义常量方式:

    1. const 数据类型 常量名 = 值 (不安全)

    2. #define 常量名 值

  • 变量:在程序运行过程中,其值可以发生改变的量,称为变量;

    定义格式: 数据类型 变量 = 值

  • 标识符:

    1、不能使用系统关键字;

    2、允许使用字母数字下划线;

    3、不允许数字开头;

    4、标识符区分大小写;

    5、见名知义;

二、scanf安全问题解决:

先看例子:

#include<stdio.h>

main()

{

int a=123;

char c='t';

printf("input ");

scanf("%d%c",&a,&c);

scanf("%d%c",&a,&c);

scanf("%d%c",&a,&c);

printf("%d %c ",a,c);

return 0;

}

运行之后会发现,当输入a回车后,会直接跳过下面2个[scanf语句],直接输出为

123

t;

其原因是:对于scanf("%d%c",&a,&c)scanf语句执行时,其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语句。

解决方法是:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还有残余信息问题。

#define _CRT_SECURE_NO_WARNINGS
pragma warning(disable:4996)

三、原码、反码与补码

01二进制和十进制转换.png

02八进制和十进制转换.png

03十六进制进制和十进制转换.png

下面通过一些例子来体会领悟各自的用法:

  1. char ch = 10;

    原码:0000 1010

    反码:0000 1010

    补码:0000 1010

  2. char ch1= -10;

    原码:1000 1010

    反码:1111 0101

    补码:1111 0110 f6

  3. ch-ch1=0;

    补码:0000 1010

    补码:1111 0110

    1 0000 0000

    0000 0000

注意 0在计算机中存储的方式:

int a=0;

0000 0000 

4. 简单的加减法

76 - 32:76+(-32) = 44

原码:0100 1100 反码:0100 1100 补码:0100 1100

原码:1010 0000 反码:1101 1111 补码:1110 0000

补码:0100 1100 补码:1110 0000 1 0010 1100 补码:0010 1100 反码:0010 1100 原码:0010 1100 44

四、汇编语言知识补充

  • 汇编语言常用命令:

mov 移动; add 添加; push 压栈; pop 出栈; call 调用;

  • eax 32位寄存器简单加法计算:

      //__asm
      //{
      //	mov a, 10
      //	mov b, 20
      //	mov eax, a
      //	add eax, b
      //	mov c, eax
      //}
    
  • 断点和单步调试:

断点: 在选中行单击或按F9

调试程序:在“调试”中选择“开始调试”或按F5

逐语句执行:F11

逐过程执行:F10

跳出过程:Shift+f11

停止调试:Shift+F5