C語言 對有符號數和無符號數的理解

2021-10-07 16:40:35 字數 1001 閱讀 5578

1、提出問題

如果在計算機的記憶體種存放了二進位制1000 0000,它代表的值究竟是多少?

2、基礎概念

- 原碼、反碼、補碼

正數的原碼=補碼=反碼,例如:

對於十進位制數128,它的原碼、反碼、補碼分別是

原碼:1000 0000

反碼:1000 0000

補碼:1000 0000

負數的原碼等於它本身,反碼等於原碼按位取反,補碼等於反碼+1,例如:

對於十進位制數128,它的原碼、反碼、補碼分別是

原碼:1000 0000

反碼:0111 1111

補碼:1000 0000

- 資料在記憶體的存放形式

需要明確知道,不管是什麼資料,它在記憶體中是以補碼的方式存放的,因此你通過jlink檢視記憶體的時候,看到的就是補碼。

- 無符號數和有符號數的區分

無符號數8個位元組都是資料位,有符號數最高位表示符號位,1表示負數,0表示正數。

3、解決問題

既然資料在記憶體中是以補碼的方式存放的,那麼當我們看到記憶體中的資料是1000 0000的時候,我們就知道它是補碼,想知道它表示的真實值是多少,就是由補碼推算原碼的過程。

- 補碼推算原碼

正數的原碼=反碼=補碼

負數的原碼=補碼取反+1(符號位除外)

- 表示無符號數

如果這表示的是無符號數,那它必然是正數,正數的原碼=反碼=補碼,因此1000 0000表示的就是無符號數的128。

- 表示有符號數

如果這是有符號數,1000 0000的最高位是1,因此它表示的是負數。

負數的原碼=補碼取反+1(符號位除外)

而000 0000取反就是111 1111,也就是127,再+1 就是128。

因為它表示的是負數,所以是-128。

4、結論

因此如果1000 0000表示無符號數,它表示128。如果它表示有符號數,就是-128。

因此也知道有符號數127溢位以後,是變成-128而不是-1了。

C 有符號數和無符號數

1.有符號數和無符號數 c支援所有整形資料型別的有符號數和無符號數運算。儘管c標準並沒有指定某種有符號數的表示,但是幾乎所有的機器都使用二進位制補碼。通常,大多數數字預設都使有符號的,c也允許無符號數和有符號數之間的轉換,轉換原則是基本的位表示保持不變。因此在一台二進位制補碼機器上,當從無符號數轉換...

有符號數和無符號數

有符號和無符號整數 1.通常情況下,大多數字預設的是有符號數,比如 4,5 要想寫乙個無符號數必須在後面加u 比如 4u,5u 2.在計算機中有符號數是用補碼的形式來表示的,最高位是符號位。無符號數就是正數唄 正數的補碼和原碼相同。比如 1 在計算機中表示為 11111111 11111111 11...

無符號數和有符號數

人有十個手指頭,習慣了逢十進一,於是十進位製成了生活中的標準。程式的世界只有高低電平兩種狀態,更適合用二進位制來表示,於是二進位製成了程式世界的標準。對與無符號數來說,我們更喜歡談他們之間的轉化,十進位制是我們最習慣的進製,於是十進位制轉為r進製,r進製轉為十進位制變尤為重要。十進位制 r進製 整數...