CSAPP-Bits Bytes and Integer

Bits Bytes and Integer

1.1 Information is Bits in Context

比特(binary digit),是表示信息的最小單位,狀態0和1。

源程序是一個由0和1組成的位序列(也稱爲比特序列),8個位被組織爲1組,稱爲字節。每個字節代表程序中的某些文本字符。大部分現代計算機使用ASCII標準來表示文本字符,用單字節整數值來區分每個字符。只有ASCII字符組成的文件稱爲文本文件,所有其他類型的文件稱爲二進制文件

爲了在系統上運行hello.c程序,每一條C語句必須被其他程序翻譯成低級機器語言指令的集合,這些指令按照稱爲可執行目標程序的格式打包好,作爲二進制磁盤文件存儲。

在Unix系統,源文件到目標文件的轉換需要編譯驅動程序。

gcc -o hello hello.c

ls
hello  hello.c

Centos 安裝gcc編譯器 yum -y install gcc gcc-c++ kernel-devel //安裝gcc、c++編譯器以及內核文件

GCC編譯器驅動程序將源文件hello.c翻譯成可執行目標文件hello。翻譯過程的執行需要4個階段,預處理、編譯、彙編、鏈接。執行4階段的程序pre-processor預處理器,compiler編譯器,assembler彙編器,linker鏈接器構成了編譯系統

計算機系統和硬件組成

所有應用程序對硬件的嘗試必須經過操作系統。

操作系統有兩個主要功能:

  1. 保護硬件不會被失控的應用程序濫用
  2. 嚮應用程序提供簡單一致的機制來控制不同低級的硬件設備

通過基本的抽象概念實現:進程、虛擬內存、文件。

進程

進程是計算中的程序關於某數據集合上的一次運行活動,是系統資源分配和調度的基本單位

shell進程通過“系統調用”將控制權傳遞給操作系統,操作系統保存shell進程的上下文,創建一個新的hello進程的上下文然後將控制權傳遞給hello進程,待hello進程執行完畢操作系統恢復shell進程的上下文和傳遞迴控制權。

線程

一個進程由多個可執行單元組成,稱爲線程,每個線程運行在進程的上下文中,共享同樣的代碼和全局數據。多線程成爲越來越重要的程序模型,多線程比多進程更容易共享數據,因爲線程比進程一般來說更高效。

虛擬內存

虛擬內存是一個抽象概念,爲每個進程提供一個假象–每個進程獨佔使用主存。每個進程看到相同的內存,稱爲虛擬地址空間。

機器字長:機器字長是指計算機進行一次整數運算所能處理的二進制數據的位數。覺得虛擬地址空間的大小,n位比特的機器字長,虛擬地址的範圍是0-2n-1,程序最多能訪問2n個字節。

字節順序有兩種方式:大端模式和小端模式。假設int類型變量x=0x01234567在機器中有兩種存儲方式。

大端模式:是指數據的高字節保存在內存的低地址中。

小端模式:是指數據的高字節保存在內存的高地址中。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PFV9p45H-1589163218916)(Bits Bytes and Integer.assets/截屏2020-05-09 下午10.09.22.png)]

大多數intel兼容機都只採用小段模式。

C語言移位運算

右移運算有兩種形式:邏輯右移和算術右移。

邏輯右移左端補k個0,算術右移左端補k個最高有效位的值。

無符號數與有符號數

二進制轉無符號數,UMin = 0, UMax = 2w-1

二進制轉有符號數,TMin = -2w-1,TMax = 2w-1-1

有符號與無符號比較時,會隱式地將有符號轉成無符號數進行運算。

#include <stdio.h>
	int x = -1;
	unsigned int y = 0;
	if (x > y) {
		printf("x > y");
	} else if (x == y) {
		printf("x = y");
	} else {
		printf("x < y");
	}
}

output:
x > y

此時-1與0u比較,需要將-1轉換爲有符號數比較,假設int是64機器上4字節,-1的有符號表示是4294967295,所以-1>0u。

有符號與無符號數有很多陷進,極大刷新了我的認知。

#include <stdio.h>
int main() {
	unsigned int i;
	for (i = 10; i >= 0; --i) {
		printf("hello world\n");
	}
}


#include <stdio.h>
int main() {
	int i;
	for (i = 10; i - sizeof(char) >= 0; --i) {
		printf("hello world\n");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章