Loading

深入理解计算机系统-学习笔记02

第2章 信息的表示和处理

#include<stdio.h>
typedef unsigned char* byte_pointer;
void show_bytes(byte_pointer start, size_t len) {
    size_t i;
    for (i = 0; i < len; i++) 
	printf("%.2x", start[i]);
    printf("\n");
}

上述这段代码是书中的一部分。

  • size_t:无符号整形,在32位系统上占4个字节,是unsigned int;在64位系统上占8个字节,是Unsigned long。
  • %.2x:输出十六进制,宽度至少为两位。

这段程序的意思是,打印程序对象的字节表示。

大端机器:低地址存放高位数据。
小端机器:低地址存放低位,如window,linux。

  • Unicode,基本编码,统一用32位表示字符。
    缺:每个字符都要占用4个字节
  • utf-8,常用字符只需要1-2个字节,不常用的才需要4个字节,向下兼容ASCII

Java使用unicode表示字符串。

从机器的角度看,程序只是一串0和1。

R G B
红 绿 蓝
000 黑色
111 白色
100 红色
010 绿色
001 蓝色

还挺有意思的。

从布尔运算到位运算

位运算的典型应用:掩码运算
掩码运算:从一个字中选出特定的位

逻辑运算
and or not

移位运算

  • 逻辑移位
  • 算术移位

整数表示

C语言头文件stdint.h重定义了一些数据类型。
image

端午节。

我觉得这部分看着好无聊,看不下去,总想跳。

从2.1-2.3 讲得都是关于整数,整数如何表示以及整数的加减乘除。

C语言有有符号数和无符号数,这二者编译成二进制表示不太一样。

如果是无符号数,那就直接转成二进制;
如果是有符号数,那就采用补码的方式。

java只有有符号数,也就是采用补码,所以在任何系统上安装了解释器就可以很快解释好。

下面是浮点数。

对于浮点数,二进制只能无限逼近,而不能精确表示。
\(\frac{1}{5}\)
0.0
0.01 0.25
0.001 0.125
0.0011 0.1875
0.001101 0.203125
可见位数越多能够表示的数据也就越精确。

OH,no这下面讲的什么鬼,我都不太能看懂。

只能说大部分都没有看懂。
没关系没关系,继续看第3章吧。
程序的机器级表示。

posted @ 2025-06-01 16:06  王仲康  阅读(67)  评论(0)    收藏  举报