對於資料型別,蝦公尺這個圖應該很清楚了吧。
一、三個碼
初學c的時候就對原碼、反碼、補碼之類的不明白,乙個簡簡單單的十進位制數字為什麼要用那麼一大長串的01表示?真是多此一舉。
後來才知道,語言電腦是非常笨的,他只能識別0和1兩種數字,其他的數字 他都不認識。所以為了讓人類和人工智慧更好的交流,人類發明了二進位制。
如果cpu裡面生存有外星人的話,他們一定只有兩根手指。
原碼:計算機對數字的二進位制表示方法,最高位符號位,0正1負。
反碼:對原碼各位取反得到,如果機器數是整數,反碼 = 原碼,若機器數是負數,反碼 = 原碼(取反)。
補碼:如果機器數是整數,補碼 = 原碼,如果機器數是負數,補碼 = 原碼(除符號位外各位取反,並在末尾加1).
無符號數並不能表示負數,所以出現有符號數,但是原碼表示有符號數會有問題。具體就不展開。
為了解決這兩個問題,採用補碼表示有符號數。
但是對於無符號數,三個碼都是一樣的,所以,整數在計算機中,使用補碼表示。
二、溢位
在現在的計算機配置中,這並不是我們該擔心的問題,我們目前 編的程式想要計算機溢位還是很困難的,除非你要處理全世界的人口問題。所以這個問題就不展開了。
資料型別
所佔位元組數
取值範圍
short
2-32768~32767,即 -215~(215-1)
unsigned short
20~65535,即 0~(216-1)
int4
-2147483648~2147483647,即 -231~(231-1)
unsigned int
40~4294967295,即0~(232-1)
long
4-2147483648~2147483647,即 -231~(231-1)
unsigned long
40~4294967295,即0~(232-1)
三、char與int
8位二進位制數的整數資料型別就叫做 char。
乙個例子說明他們的關係。
int i = 'a'不同的編譯器,對char是否有符號都有自己的定義,但是暫且不管他。;char c = 97
;i = c;//
安全,char可以賦給int
c = i;//
不安全,int不能賦給char
四、浮點數的有效位
從理論上說,浮點數也存在溢位問題,但是就float所能表示的範圍是10的負38次方到10的38次方,這已經是很大的範圍了。
通常float型別的有效位只為6位或7位,當輸出的位數大於這個值的時候,大於的位數都是編譯器隨機猜的了。
當時當判斷兩個浮點數是否相等的時候,有出現問題了,浮點數儲存的時候都是近似值,所以不能直接比較,(這個只是點我真是第一次聽說)。
要不是親自試驗一下,我還真不信。
int說道常量與常量字尾,常量字尾就是告訴編譯器,請把我當成這種資料型別。這樣可以編譯器預設處理帶來的潛在溢位或移植問題。main()
比如,10ul,表示這個是unsigned int;型別。
五、sizeof(指標)和sizeof(陣列)的區別
參見博文:
引用如下/****************************
sizeof的意思是返回乙個物件在記憶體中的位元組數,是size_t型別的。
如果宣告乙個指標,比如 char* pstr = "hello";pstr是乙個指標,那麼sizeof(pstr)的值是4,
如果宣告乙個陣列,比如 char pstr = "world";這時,pstr代表乙個陣列,那麼sizeof(pstr)的值就是這個陣列在記憶體中的位元組數(包括\0)。
測試**:
#include
int main()
dev-c++下編譯通過,執行結果 6 4。
解釋:char str = "world";
這裡初始化不限定長度,而"world"包含結束符'\0'後為6個字元,因此初始化str的長度是6;又因為char陣列中每個元素(char變數)占用1個位元組的空間,所以str陣列的大小是6位元組。
char *pstr = "world";
由於pstr是指標,無論是否指向字串,指向什麼字串,sizeof(pstr)等於sizeof(int),32位平台上等於4。
造成差別的原因:
這裡char str = "world";宣告並定義了乙個陣列str(當然,c語言的語法不允許在定義之外這樣引用整個陣列,以下這樣的寫法只是為了區分語義)。
識別符號str有雙重語義:一是如2l所說的型別為char* const的位址常量,它的值等於陣列中首個元素的位址,即str等價於(char* const)&str[0];二是表示整個str陣列這個語法物件。
在sizeof(str)中,str表示的含義是str,因此返回整個陣列的大小(這個大小在之前的陣列定義中已經確定了);而pstr只是個指標,sizeof(pstr)只能返回指標本身占用的位元組數而不能確定為它指向的內容分配的空間的大小。
注意,位址常量絕不是指標,型別不同!雖然在函式的引數傳遞過程中,位址常量可以退化成對應的指標。這裡顯然由於這個錯誤理解導致對陣列的sizeof()結果判斷有誤。)
MySql資料型別 讀書筆記
一.選擇優化的資料型別 更小的通常更好 在允許的情況下,應該盡量使用可以正確儲存資料的最小資料型別,因為占用更少的磁碟,記憶體和cpu快取,處理周期短,例如只要儲存0 200,tinyint unsigned 更好 簡單就好 例如整型比字元型操作代價更低,因為字符集和校對規則 排序規則 使字串比較比...
golang 讀書筆記 資料型別
slice 切片 代表變長的序列,序列中每個元素都有相同的型別。乙個slice型別一般寫作t,其中t代表slice中元素的型別 slice的語法和陣列很像,只是沒有固定長度而已。乙個slice由三個部分構成 指標 長度和容量。指標指向第乙個slice元素對應的底層陣列元素的位址,要注意的是slice...
資料型別基礎資料型別
資料型別 基礎型別 除八大基礎型別其他的都是引用型資料型別 引用資料型別 基礎資料型別 整型 byte 佔乙個位元組,範圍 128 127 short 佔兩個位元組,範圍 32768 32767 int 最常用 佔四個位元組,範圍 2147483648 2147483647 long 佔八個位元組 ...