有符號和無符號資料型別

2022-08-27 17:45:10 字數 1584 閱讀 4035

原版出處:

c語言中提供了很多整數型別(整型),主要區別在於它們取值範圍的大小。int代表有符號的整數,也就是說,用int宣告的變數可以是正數也可以是負數,也可以是零,但是只能是整數。

比如:int a = 3; int b = 0; int c = -5;

以上這些都是合法的。

int的取值範圍因機器而異,一般而言,在較舊的pc上,int值在記憶體中一般是按2個位元組(16位)進行儲存的,在較新的pc以及工作站和大型機上,int值在記憶體中一般是按照4個位元組(32位)進行儲存的。

c語言中將基本資料型別劃分為signed(有符號)和unsigned(無符號)兩大類。

例如,初始化變數int a = -3;其實它等價於signed int a = -3;關鍵字signed在這裡可以省略,因為c語言預設就是有符號型別的,如果要定義無符號型別的數(也就是0和正整數)可以這樣定義,unsigned int b = 5;

為了說明清楚signed和unsigned的區別,首先需要了解資料在記憶體中是如何儲存的,在計算機中所有的資料都是按照二進位制進行儲存的(以下假設在字長為2個位元組的機器上來表示)。

舉個例子來說,unsigned  int a = 1; 變數a在記憶體中就是以00000000 00000001來儲存的,用圖表的形式表示:

因為這裡是unsigned  int,它是無符號整型,所以的它的16位全部用來表示資料。

int b = -1;

這裡情況就稍微有點複雜了,注意數字1和-1在記憶體中的儲存是完全不一樣的,請看,

在計算機中,整數是以原碼的形式儲存的,而負數是以補碼的形式儲存的,原碼大家都知道也就是它對應的二進位製碼,那什麼是補碼呢,就是原碼的反碼加1,反碼就是原碼的各位取反,例如-1的補碼是:

首先1的原碼是                     00000000 00000001

其次取它的反碼是                 11111111 11111110

最後在其反碼的基礎上加上1   11111111 11111111

得到-1的補碼是,11111111 11111111

用圖表的形式表示:

從上圖中可以看出,int用15位來表示乙個數字,第1位被符號位占用了,其實大家應該不難看出在數學中-1是負數中最大的整數,所以這裡看到它的各個位都置1,對應於二進位制來講就是最大的數了,計算機就是按照符號位來識別該數是正是負,所以第一位只起到標識的作用並不作為資料位來使用,而其餘的15位才是真正的資料位。以補碼的形式來儲存有個好處那就是計算機將負數的運算當作加法來處理了。那麼將乙個有符號的數賦給乙個無符號的數會發現乙個很有趣的現象,比如:

unsigned int a;

int b = -1;

a = b;

printf("a=%u",a);

輸出a=65535,這個結果是怎麼出來的呢?其實很簡單,b=-1,根據上圖-1在計算機中的資料位是1111111 11111111,注意是資料位,是要去掉符號位的,所以是15位,a是無符號型別的整數,將b賦給a,自然a就是1111111 11111111,也是15位第一位補0,轉換成十進位制就是65535,它也是unsigned int範圍的最大上限(0~65535 216-1),-1是最大的負整數轉換成正整數當然也是最大了,這個應該很好理解了。

有符號整型資料和無符號資料型別

整型有無符號 unsigned 和有符號 signed 兩種型別 在預設情況下宣告的整型變數都是有符號的型別 char有點特別 如果需宣告無符號型別的話就需要在型別前加上unsigned。無符號數隻表示大小,有符號數最高位 二進位制情況下最高位表示符號位 在同一作業系統 下,有符號數和無符號數的最大...

有符號數和無符號數

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

無符號數和有符號數

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