變數之問題

2021-07-23 22:43:49 字數 4455 閱讀 1842

/*32位機*/

整型是以補碼儲存方式儲存的

正整數正數的補碼和原碼相同

例如 5

在記憶體中用 00000000

00000000

00000000

00000101表示

00的補碼是0x00000000

負整數負整數的補碼是通過將負整數的絕對值的二進位制,按位取反後再加1得到的

例如 -5

-5的絕對值是5,在記憶體中用 00000000

00000000

00000000

00000101表示

按位取反後得到 11111111

11111111

11111111

11111010

加1後得到 11111111

11111111

11111111

11111011

字元型是以補碼儲存方式儲存的

在記憶體裡跟1個位元組的整型沒什麼不同,只不過在表現形式上多了一種表現方式

可以用整數來表示

可以用字元來表示,是因為映**乙個字元

字元的取值範圍為 0 ~ 255

例如 -159

-159的絕對值是159,在記憶體中用‭ 10011111 ‬表示

按位取反後得到 01100000

加1後得到 01100001

等於 97 ,可以用字元'a'來表示

bcd碼

是一種二進位制的數字編碼形式,用二進位制編碼的十進位制**.

用4位二進位制數來表示1位十進位制數中的0~9這10個數碼。

例如 十進位制數 89

用 8421碼表示為 10001001 用十六進製制表示為 0x89

用 5421碼表示為 10111100 用十六進製制表示為 0xbc

8412碼是最常用的bcd碼,將0x11展開為二進位制就是0x11在記憶體中的儲存方式

不在c檔案中使用

c檔案中應用的編碼

整型常量 137 在記憶體中的表示為 00000000

00000000

00000000‭ 10001001‬ ,可以用 0x89 表示

char c1 = 256;//列印出來為0,不是字元'0',字元null,現象為什麼都沒有.

char c2 = -159;//列印出來為97,字元'a'

它是end of file的縮寫,表示"文字流"(stream)的結尾

eof不是特殊字元,而是乙個定義在標頭檔案stdio.h的常量,一般等於-1

定義在stdio.h中 #define eof (-1)

在linux系統之中,eof根本不是乙個字元,而是當系統讀取到檔案結尾,所返回的乙個訊號值(也就是-1)

這個訊號是誰給的?

所有的ascii碼都可以用「\」加數字(一般是8進製數字)來表示。

1.'\0141' 代表'a'

- 注意 \0***中 ***的取值範圍為 從 000 到777(注意是8進製,沒有8和9)

2.'\\' 代表'\'

1. 歷史

在計算機還沒有出現之前,有一種叫做電傳打字機(teletype model 33)的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。

於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字元。乙個叫做「回車」,告訴打字機把列印頭定位在左邊界;另乙個叫做「換行」,告訴打字機把紙向下移一行。

後來,計算機發明了,這兩個概念也就被般到了計算機上。那時,儲存器很貴,一些科學家認為在每行結尾加兩個字元太浪費了,加乙個就可以。於是,就出現了分歧。

- unix系統裡,每行結尾只有「《換行》」,即「\n」;

- windows系統裡面,每行結尾是「《換行》《回車》」,即「\n\r」;

- mac系統裡,每行結尾是「《回車》」。

乙個直接後果是//不過現在軟體都處理好了,不會出現這種問題

- unix/mac系統下的檔案在windows裡開啟的話,所有文字會變成一行;

- windows裡的檔案在unix/mac下開啟的話,在每行的結尾可能會多出乙個^m符號。

2.字元

換行 '\n' 十進位制10

0x0a 指回到一行的開頭

回車 '\r' 十進位制13

0x0d 指開啟新的一行

3.例項(liunx下)

printf("abc\rdef\n"); //效果 def

printf("abc\ndef\r"); //效果 abc

printf("abc\n\r"); //效果 abc

printf("abc\r\n"); //效果 def

字串常量為什麼可賦值給指標? 

雙引號做了3件事

申請了空間(在常量區),存放了字串

在字串尾加上了'\0'

返回位址

strlen("\0")    為   0

strlen("\0\0") 為 0

sizeof("\0") 為 2

sizeof("\0\0") 為 3

1.

char * p = "hello";

"hello"返回乙個位址,賦值給指標p

2.char p = "hello"

申請乙個連續的空間,剛好存'h'

'e''l'

'l''o'

'\0'

6個字元

注意:這裡不管最後是不是'\0'結尾,都要添乙個'\0'

3.strlen

sizeof

char * p = "hello";

char c = "hello";

printf("%d\n",sizeof("hello")); 6

//為什麼是6?

printf("%d\n",sizeof(p)); 4

printf("%d\n",sizeof(c)); 6

printf("%d\n",strlen("hello")); 5

printf("%d\n",strlen(p)); 5

printf("%d\n",strlen(c)); 5

野指標 : 有指向,但是指向是隨機分配的 

空指標 : 有指向, 指向的是編號為0的位址

對野指標/空指標進行取內容操作,會出現段錯誤

空指標常量可以用下列表示

1. 整型常量0、0l、'\0'、3 - 3、0 * 17

2. (void*)0

null 是乙個標準規定的巨集定義,用來表示空指標常量。

#define null (void*)0

陣列是多個相同型別的元素的集合

如果每個元素為int型陣列的話,那麼整個陣列就是個二維陣列.

其實陣列沒有維度的概念.

想引用乙個最小的元素,需要找到它的上一級,如果它的上一級還是陣列中的乙個元素,那麼就一直往上找,直到找到陣列名.這樣的話就走出一條通路,然後從陣列名一級級往下引用,直到那個最小的元素

定義足夠大就可以了,不給具體大小的話,編譯器無法給陣列分配空間
無法直接對陣列變數賦值.可以乙個乙個元素賦值

如果是字元陣列的話,可以用strcpy來賦值

只有當sizeof(陣列名)的時候,陣列名才指代陣列整個空間

其他情況下,都是指代陣列中首個元素的位址

說起宣告的話,只有extern 是用來宣告的

其他情況下,都是定義變數

另外結構體型別/列舉型別/共用體型別的宣告都是宣告

有些部落格說定義就是分配記憶體,宣告不會分配記憶體,這是不準確的的

#define pi 3.1415926

此巨集定義沒有分配記憶體

char/short ->int ->long ->double 會自動轉換

float ->double 會自動轉換

當然也可以強制型別轉換,語法為

(型別名)變數

常量與變數的互動產生乙個變數

變數與變數的互動產生乙個變數(一般情況下會成立,像a^a,結果為0)

常量與常量的互動產生乙個常量

Tensorflow之單變數線性回歸問題的解決方法

跟著網易雲課堂上面的免費公開課深度學習應用開發tensorflow實踐學習,學到線性回歸這裡感覺有很多需要總結,梳理記錄下階段性學習內容。題目 通過生 工資料集合,基於tensorflow實現y 2 x 1線性回歸 使用tensorflow進行演算法設計與訓練的核心步驟 1 準備資料 2 構建模型 ...

返回函式之迴圈變數問題

返回函式之迴圈變數問題 一 學習要點 1.返回函式建立的時候不被執行,呼叫的時候才被執行 2.返回函式不要應用任何迴圈變數或者後續會發生變化的變數 3.如果一定要引用迴圈變數,方法是在建立乙個函式,用該函式的引數繫結迴圈變數當前的值,無論該迴圈變數後續如何更改,已繫結的函式引數的值不變 二 學習 結...

執行緒同步之條件變數注意問題理解

1 條件變數的作用 條件變數與互斥量一起使用,個人理解,適用於共享資源需要滿足一定條件才需要執行的操作,如生產者 消費者模型中,生產者生產了資源並掛在公共區域後,消費者才能去消費這個資源 而單獨使用條件變數的情況是,共享資源不需要進行判斷 2 生產者執行緒中,2.1 pthread mutex un...