在c語言的學習中,我們都知道型別分為有符號和無符號,無符號型別能夠定義的最大值是有符號所定義最大值的二倍加一,因為二者中都有乙個0的存在所影響的。
那麼負的最小值是怎麼儲存的呢,這裡就拿char型別來說明吧,無符號char的範圍是0~255,有符號的char範圍是-128~127。規定是這樣,但是在記憶體中-128怎麼表示或者說是怎們儲存的呢,1000 0000代表的是-0還是-128呢?
我們知道計算機在記憶體中對資料的操作都是以補碼來完成的,補碼的概念:正數的補碼與原碼相同,負數的補碼=反碼+1。 反碼:如果是負數,符號位是它的最高位不動,其它位數值位按位取反,0變1,1變0。以8位二進位制為例,一位元組為八位元,負數的補碼演算法公式:1 0000 0000(模) - 該數絕對值。(「模」是指乙個計量系統的計數範圍。如時鐘,時鐘的計量範圍是0~11,模=12。表示n位的計算機計量範圍是0~2^(n)-1,模=2^(n)。「模」實質上是計量器產生「溢位」的量,它的值在計量器上表示不出來,計量器上只能表示出模的餘數。任何有模的計量器,均可化減法為加法運算。)
這裡以八位二進位制為例進行舉例說明:
比如:
-1補碼:1 0000 0000 - 0000 0001 = 1111 1111;
-3補碼:1 0000 0000 - 0000 0011 = 1111 1101;
-127的儲存我麼都知道是1111 1111,127的儲存是0111 1111,char的取值範圍是-128~127,那麼問題來了,-128是怎麼儲存的,很多資料說的都是 1000 0000,它究竟是怎麼來的呢?
可以這樣理解和記憶:-128 首先它是個負數,那麼我們用負數算補碼方式計算,得到:1 0000 0000 - 1000 0000(-128絕對值) = 1000 0000; 如果這樣覺得還是不靠譜,不妨我們推論一下,這個推論是我借助師傅鮑老師的:
假設1:表示-0。
那麼 -0的補碼: 1 0000 0000 - 0 =0000 0000
反碼: 1111 1111 (0000 0000 -1 = 0000 0000 +1111 1111=1111 1111)
原碼: 1000 0000(反碼取反)
假設2:表示-128。
-128的補碼: 1 0000 0000 - 1000 0000(+128沒有符號位)= 1000 0000
反碼: 1111 1111 (1000 0000 -1 =1 000 0000 + 1111 1111 = 1111 1111)(補碼-1)
原碼: 1000 0000(反碼取反)
從上面看來,乙個原碼對應了2個補碼。按照c語言的定義,在32位的系統裡,int表示的範圍為-2^31 ~ +(2^31-1),那麼可以推論出有符號數可以表示負的最大值,而沒有-0的定義。也就是說上面1000 0000 表示的應該是-128,而不是-0。
整型資料在記憶體中如何儲存
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!以下討論,針對32位的計算機系統。問 int型資料佔幾個位元組?答 4位元組。地球上這個群體的人都知道。再問 這4個位元組,即32個二進位制位,又是何儲存?這就進入計算機的 底層 了。這個事情,學習程式設計的童鞋,可以懂。儲存的方式,和我們拍腦袋想...
列儲存在記憶體中如何管理
memory management in the column store hana資料庫對列儲存進行了優化,保證高效的讀操作效能,同時也提供較好的寫操作效能。如上圖所有的列儲存在記憶體中的結構,分為兩部分主儲存和增量儲存。主儲存包含列表中的主要資料,進行了較高的壓縮以節省空間並加快搜尋和計算,如果...
資料在記憶體中的儲存
身為乙個天天處理資料的人,不得不說資料在記憶體中的儲存是必須要知道的問題。首先,資料在記憶體中的儲存涉及到作用域,儲存位置等方面的問題。根據資料的作用域,可將資料劃分為區域性變數和全域性變數 區域性變數的作用域為從定義開始到函式執行結束 全域性變數的作用域從程式開始到程式結束。計算機的記憶體分配可以...