[CBS课程]计算机基本原理(信息的表示与处理)

Posted IT鹅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CBS课程]计算机基本原理(信息的表示与处理)相关的知识,希望对你有一定的参考价值。

参考文章:

[C/C++系列课程]让我们重拾对梦中情人C和C++的热爱
[C/C++系列课程]操作系统OperatingSystem

CBS课程介绍:

Computer Science Basic 计算机科学与技术基础教程是一个关于计算机初级知识的课程,与C/C++系列教程同步更新,本课程采用了ICS与SP的教学模式,结合硬件,操作系统,与编程,希望本课程能为学生打好坚实的理论基础与实践基础。让学生在今后处理问题过程中,能巧妙地使用该系列课程原理解决问题,本课程适用于计算机相关专业及理工科学生自学。
本文也可作为编程基础与网络安全Pwn等领域入门参考文章。

信息存储:

ASCII参照表

大多数计算机一般以8位作为字节(Byte)大小,字节是最小的可寻址内存单位。
计算机将内存认为是一个非常大的字节数组(Byte Arrary)学术名为虚拟内存(Virtual memeory).
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上物理内存通常被分隔成多个内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
##十六进制
一个字节由8位组成,二进制值域范围00000000 ~ 11111111,十进制值域范围 0 ~ 255
由于二进制表示过于冗长,计算机科学家发明了16进制,十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F表示,其中:AF相当于十进制的1015,这些称作十六进制数字。在网页设计,操作系统设计,逆向工程中十六进制是很常用的,十六进制是每一个黑客应当掌握的基本技能。
十六进制数字 0 1 2 3 4 5 6 7 8 9 A B C D E F
十进制数字 0 1 2 3 4 5 6 7 8 9 10 12 13 14 15
二进制数字 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

在C语言、C++、Shell、Python、Java语言及其他相近的语言使用字首“0x”的数字常量,会被认为是十六进制值。
字符’A’ ~ 'F’既可以大写,也可以小写。DSDFDSF12可以表示为0xdsdfdsf12
小试牛刀:
将0x39A7F8转化为二进制 0x39A7F8=001110001001011011110111
##十进制和十六进制间的转换方法:
采用中国余数定理求解,其中余数定理属于数学分支中的数论内容。
4877÷16=304…13(D)
304÷16=19…0
19÷16=1…3
4877=130D
最好让计算机或者计算器程序完成,下面我们分别采用Pyhon/C++语言完成转换:

Python:

十六进制转换十进制:

s = '0xffa'
print(int(s,16))
print int('ff', 16)

十进制转换十六进制:

print hex(255)

binascii——二进制和ASCII码互转
「以下内容参考Python3开发者中文文档,详细网址请参考后记内容」
binascii 模块包含很多在二进制和二进制表示的各种ASCII码之间转换的方法。
binascii 模块定义以下函数:
binascii.a2b_uu(string)
将单行 uu 编码数据转换成二进制数据并返回。uu 编码每行的数据通常包含45 个(二进制)字节,最后一行除外。每行数据后面可能跟有空格。
binascii.a2b_base64(string)
将base64数据块转换成二进制并以二进制数据形式返回,一次可以传递多行数据。
*binascii.b2a_base64(data, , newline=True)
将二进制数据转换为一行用 base64 编码的ASCII字符串。返回值是转换后的行数据,如果 newline 为true,则返回值包括换行符。该函数的输出符合:rfc:3548。

import binascii
binascii.b2a_hex(b'\\xb9\\x01\\xef')
b'b901ef'
binascii.hexlify(b'\\xb9\\x01\\xef', '-')
b'b9-01-ef'
binascii.b2a_hex(b'\\xb9\\x01\\xef', b'_', 2)
b'b9_01ef'
binascii.b2a_hex(b'\\xb9\\x01\\xef', b' ', -2)
b'b901 ef'

调用binascii模块中的b2a_hex()函数,将ASCII编码转换成十六进制

print binascii.b2a_hex('A')
print binascii.a2b_hex('41')

C++:

程序取一个十六进制的数字,把它用字符串存储在一个变量中,通过for循环,我们通过余数定理,

#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int main ()

    char num[20];
    int i, r, len, hex = 0;
    cout << "Enter a hexadecimal number : ";
    cin >> num;
    len = strlen(num);
    for (i = 0; num[i] != '\\0'; i++)
    
        len--;
        if(num[i] >= '0' && num[i] <= '9')
            r = num[i] - 48;
        else if(num[i] >= 'a' && num[i] <= 'f')
                r = num[i] - 87;
             else if(num[i] >= 'A' && num[i] <= 'F')
                    r = num[i] - 55;
        hex += r * pow(16,len);
    
    cout << "\\nDecimal equivalent of " << num << " is : " << hex;
    return 0;

1. 要求用户输入一个十六进制数,其值存储在字符变量“num”中。
2. 变量‘hex’初始化为0,num的长度存储在变量‘len’中。
3. 使用 for 循环递减 len 并检查每个字符。
4. 如果它位于 0 到 9 之间,则从 ASCII 值中减去 48 并存储在 r 中。
5. 否则,如果它位于“a”到“f”之间,则减去 87,否则减去 55。
6. r 乘以 16 power len 并以十六进制存储。
7. 循环继续,直到字符串到达结尾或遇到空字符。
8. 然后打印结果。

十六进制转义符:

C/C++在表示字符型字面常量时,可以用:
十六进制转义序列:如 \\x1abf4 ,可以使用任意多的十六进制数字,直至不是十六进制数字为止;
16位的通用字符名(universe-character name):\\u后面必须跟4个十六进制数字(不足四位前面用零补齐),表示Unicode中在0至0xFFFF之内的码位(但不能表示0xD800到0xDFFF之内的码点,Unicode标准规定这个范围内的码位保留,不表示字符);
32位的通用字符名:\\U后面必须跟8个十六进制数字(不足八位前面用零补齐),表示Unicode中所有可能的码位(除0xD800到0xDFFF之外)

字数据大小

每一台计算机都有一个字长word size,字长决定虚拟地址空间最大大小。对于一个w位的机器,虚拟地址范围对应
为0 ~ 2的w次方-1.
为了适应32位机器到64位字长机器的迁移,C程序的数据内容向下进行了兼容。

gcc -m32 test.c 
gcc -m64 test.c

以上指令分别编译了两种架构的testC程序,C程序中常见的数据类型char,int,long
char主要用来存储字符串,数据类型int,long可以提供各种数据大小,在64位机器上,
int通常有4个字节,long一般在32位程序为4个字节,64位程序则为8个字节。
由于大多数程序都是以32位程序进行的字节分配,随着64位机器普及,越来越多的程序出现了设计上的缺陷,造成了各种安全问题。

字节序列

字节顺序,又称端序或尾序(英语:Endianness),在计算机科学领域中,指电脑内存中或在数字通信链路中,组成多字节的字的字节的排列顺序。在几乎所有的机器上,多字节对象都被存储为连续的字节序列。[wiki]
字节的排列方式有两个通用规则。例如,将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序;反之则称大端序。在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,所以均按照网络标准转化。
不同企业的操作系统采用不同的数据表示方法,一旦选择了某个特定的操作系统,那么字节顺序便固定下来。一般ARM系统采用小端序。
大端序Big-endian:最高有效的字节放在最前面的方式。
0x100 0x101 0x102 0x103
01 23 45 67

小端序Little-endian:最低有效字节放在最前面的方式。
0x100 0x101 0x102 0x103
67 45 23 01

注意:在字0x01234567中,高位字节十六进制为0x01,低字节为0x67.

后记:

wiki百科 字节序列
《深入理解计算机系统》 第2章 信息的表示和处理 P22-27页
https://docs.python.org/zh-cn/3/library/binascii.html

以上是关于[CBS课程]计算机基本原理(信息的表示与处理)的主要内容,如果未能解决你的问题,请参考以下文章

搞芯片开发要学会啥课程

计算机组成原理--数据格式与机器码

noip初赛选择题会考些啥内容

大数据学院|计算机科学与技术(与华为ICT学院校企合作)专业介绍

寒假作业2

计算机专业的一些课程用英语怎么说?