菜鳥的C 翻身之路(1)

2021-09-11 21:34:26 字數 2796 閱讀 1752

1.型別轉換:

當我們賦給無符號型別乙個超出它表示範圍的值時,結果是初始值對無符號型別表示值總數取模後的餘數。

比如: unsigned int i = -1;

在計算機中 負數是以補碼的形式儲存的。

原碼:將乙個數轉換成二進位制就是它的原碼。

1的原碼: 0000 0000 0000 0001

-1的原碼:1000 0000 0000 0001

反碼:正數的補碼是本身,負數的補碼是除符號位按位取反。

1的反碼: 0000 0000 0000 0001

-1的反碼:1111 1111 1111 1110

補碼:正數是本身 負數是反碼+1

1的補碼: 0000 0000 0000 0001

-1的補碼:1111 1111 1111 1111

-1是超出unsigned int 範圍的,無符號int 可以表示的總數是[0, 0xffff) 一共2^16 個數,所以-1賦給unsigned int 的值應該是 (216-1)%216,所以-1的表示形式 是 0xffff

16位的編譯器 int佔16位(2個位元組)

32或64位的編譯器 int佔32位(4個位元組)

unsigned int i = -1;

printf("%u\n", i); //4294967295

printf("%d\n", i); //-1 相當於強制轉換成signed

sizeof & memset

sizeof 用來返回型別或物件所佔的位元組數,是乙個操作符。

sizeof 三種語法形式:

e.g.

int i;

sizeof(i); //4

sizeof i; //4

sizeof (int); //4

memset(void *buffer, int c, int count)

buffer 指標 c賦給buffer指向物件的值 count 是長度(位元組數)

memset(data, 0x0f, sizeof(data))

data[0] : 0000 0001 0000 0001 0000 0001 0000 0001

3.引用 & 指標

指標與引用的區別

指標是乙個物件,而引用是別名。

指標可以不賦初值,引用不可以。

指標可以在其生命週期內指向不同的物件,引用只能在它初始化的時候賦值。

野指標

野指標是指指向了一塊隨機的記憶體空間,不受程式控制。如指標指向已經被刪除的物件或者指向一塊沒有訪問許可權的記憶體空間,之後再對其解引用。

產生原因:

void* 指標

void* 是一種特殊的指標型別,可用於存放任意物件的位址。利用void* 指標能做的事兒也比較有限:拿它和別的指標比較、作為函式的輸入輸出,或者賦給另乙個void*指標。

指向指標的引用

int i = 42;

int *p;

int *&r = p //r是乙個指向指標的引用。

r = &i;

r = 0;

4.const限定符

int i = 42;

const int &r1 = i; //允許將const int & 繫結到乙個普通int 物件上

const int &r2 = 42; //正確:r2是乙個常量引用

const int &r3 = r1 * 2; //正確: r3是乙個常量引用

int &r4 = r1 * 2; //錯誤:不能用非常量來繫結乙個常量。

int i = 43;

const int *p = &i; //p是乙個指標 指向整型常量 p指的物件的值不變(底層const)

int *const p = &i; //p是乙個常量指標 指向整型 p永遠指向i (頂層const)

const int* const p = &i; //p是乙個常量指標 指向整型常量

5.constexpr和常量表示式

const int max_files = 20;
constexpr int mf = 20;

constexpr int limit = mf + 1;

constexpr int sz = get_size(); //編譯器報錯

const int *p = nullptr;

constexpr int *q = nullptr; //q是乙個指向整型的常量指標

6.typedef(型別別名) & using (別名宣告)

typedef long long ll;

using ll = long long;

7.decltype型別指示符 & auto

int i = 42, *p = &i;

decltype(*p) c; //錯誤, c是int&, 必須初始化

decltype((i)) d; //錯誤:d是int&, 必須初始化

decltype(i) e; e是乙個未初始化的int

decltype(a = b) c;//錯誤, c是int&, 必須初始化 a並沒有真的等於b

菜鳥的it之路 起航

之前在知乎上看見怎麼學習資料結構下一位答主的回答,他引用了n.wirth 沃斯 的話 程式 資料結構 演算法。哈,菜鳥無法驗證這句話的正確性有多大 但毫無疑問的是,資料結構應當是一名菜鳥程式狗要重點學習的東西,是不可忽略的一部分。所以,這篇隨筆我將列出接下來一段時間我的資料結構學習計畫 菜鳥的爬行路...

菜鳥刷題之路 Q1

寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。一開始考慮轉化成位來計算,但是這樣 結構非常複雜且當出現負數時就難以計算。之後轉化思維,從十進位制數字計算的本身上來看 兩個數 ab cd 的計算過程可以看成是 a c e,b d f,如果e,f大於10,就保留ef 的個位數。如果出...

webpack 菜鳥的學習之路

webpack 是如何實現 hmr 的?實現的原理如何?本場 chat 會以完整的例項來展示hmr 的實現原理,包括 less scss css 檔案的熱載入。webpack 的 watch 模式與一次性打包如何實現?他們的主要區別是什麼?webpack 與 prepack 的關係?如何在 webp...