汇编语言简易教程(3):编码表示

汇编语言简易教程(3):编码表示

'表示'指的是计算机如何在内存中表示/存储. 计算机使用二进制 ( 1/0 )进行存储, 但是由于空间的限制, 任何表示方式只能表达一定范围, 一定精度的数据.

本章简要总结了整数、浮点和 ASCII 表示方案。

假设读者已经普遍熟悉二进制、十进制和十六进制编号系统。

应该注意的是,如果没有指定,则数字以 10 为基数。

此外,前面带有 0x 的数字是十六进制值。例如,19 = 1910 = 1316 = 0x13

整数

image

无符号整数

image

可以直接从0开始表示到(2N - 1)的范围

有符号整数

image

补码

仅针对负数

  1. 按位取反
  2. 得到的值 +1
package main

import "unsafe"

func int64ToUnit64(i int64) uint64 {
	return *(*uint64)(unsafe.Pointer(&i))
}

func uint64ToInt64(u uint64) int64 {
	return *(*int64)(unsafe.Pointer(&u))
}

func main() {
	for i := int64(-10); i < 10; i++ {
		// print bit representation of int64
		// 64 bits
		// 1 bit for sign
		// 63 bits for value
		v := int64ToUnit64(i)
		s := ""
		for j := 63; j >= 0; j-- {
			if v&(1<<j) > 0 {
				s += "1"
			} else {
				s += "0"
			}
		}
		println(i, s)
	}
}

补码的设计使得加法和减法可以使用相同的电路进行计算,并且可以将符号位和其他位统一处理,简化了计算机内部的硬件设计。

表示区别

image

需要注意区别类型!!!

浮点数

IEEE 32-bit

image

计算公式

$N=(−1)S×1.F×2^{E−127}$

实际上是二级制的科学计数法.

转换过程

  1. 计算二级制表示
  2. 确定起止位, 确定小数点要移动几位

举例

image

  1. 确定符号位
  2. 将数字用二进制表示(注意小数部分只能拟合)
  3. 确定第一个1的位置
  4. 确定F​和E​, 需要注意E要 + 127

IEEE 64-bit

表达方式和IEEE 32-bit几乎一致, 但是有更好的精度和范围

image

NaN

not a number

当一个值被解释为浮点值并且不符合定义的标准(无论是 32 位还是 64 位)时,它就不能用作浮点值。

如果将整数表示形式视为浮点表示形式,或者浮点算术运算(加、减、乘或除)导致值太大或太小而无法表示,则可能会发生这种情况。

不正确的格式或无法表示的数字被称为 NaN,它是 not anumber 的缩写。

字符以及字符串

字符表示

在计算机中,字符是对应于符号(例如字母表中的字母)的信息单元。

字符的示例包括字母、数字、常见标点符号(例如“.”或“!”)和空格。

一般概念还包括控制字符,它们并不对应于特定语言中的符号,而是对应于用于处理文本的其他信息。控制字符的示例包括回车符或制表符

ASCII (American Standard Code for InformationInterchange)

image

Unicode

应该注意的是,Unicode 是当前标准,包括对不同语言的支持。

Unicode 标准提供了一系列不同的编码方案(UTF-8、UTF-16、UTF-32 等),以便为每个字符提供唯一的编号,无论什么平台、设备、应用程序或语言。

在最常见的编码方案 UTF-8 中,ASCII 英文文本在 UTF-8 中看起来与在 ASCII 中完全相同。 根据需要,其他字符将使用其他字节

UTF-8编码格式

UTF-8使用一到四个字节为每个字符编码,编码长度取决于字符的Unicode码点:

  • 1字节:用于表示标准ASCII字符,范围从0x00​到0x7F​。这意味着ASCII文本也是合法的UTF-8文本。
  • 2字节:用于表示拉丁字母补充、希腊字母、西里尔字母、亚美尼亚字母、希伯来字母、阿拉伯字母等字符。
  • 3字节:用于表示基本多文种平面(BMP)内的字符,这包括了大多数常用的字符。
  • 4字节:用于表示那些辅助平面的字符,包括一些较少用的符号和表情符号。

UTF-8编码的具体规则

  • 对于单字节的字符,第一个字节以0​开头,后面7位代表字符(与ASCII码相同)。
  • 对于多字节的字符,第一个字节以连续的n​个1​开头,后面跟一个0​,表示这个字符占用n​字节。随后的字节都以10​开头。剩余的位用于编码字符。

举例

  • ASCII字符A​(码点0x41​)的UTF-8编码是0100 0001​。
  • 欧元符号​(码点0x20AC​)的UTF-8编码是1110 0010 1000 0010 1010 1100​(3字节)。
  • 某些表情符号,如,其码点可能超过0xFFFF​,因此需要4字节来编码。

字符串

string是一系列 ASCII 字符,通常以 NULL 结尾。 NULL 是不可打印的 ASCII 控制字符。 由于它不可打印,因此可以用来标记字符串的末尾

image

通常来说字符串就是连续的字符表示.

posted @ 2024-04-10 12:01  pDJJq  阅读(55)  评论(0)    收藏  举报