/*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...