有符號數和無符號數相互轉換問題

2021-06-27 20:50:59 字數 1177 閱讀 3518

備份自 

平時工作中有符號數用的少,昨天同事在現場更改**需要用到有符號數,發回家裡後一下子我也有點暈,又查查資料在iar和vs中也驗證了下,做好

如下記錄。

c語言中無符號數和有符號數一起比較、運算時,有符號數會隱式轉換到無符號數。

1.無符號數--->有符號數

首先判斷無符號數的最高位是否為1,如果不為1,則有符號數就直接等於無符號數;如果為1,則將無符號數取補碼,得到的數就是有符號數。

本質上就是無符號數在儲存器中的二進位制數直接按照有符號數來解析。

現象上也可理解為無符號數先看成有符號數然後取補碼。因為取補碼時符號位不變,正數的補碼就是原碼。

以unsigned char 和 signed char為例子:

定義 unsigned char ui; signed char si;

1.1 將無符號數2轉為有符號數

前提:ui = 2;

si = ui;

結果:si = 2;

2的原碼是:0000 0010,最高位不為1,因此si = 0000 0010。

1.2 無符號數130轉為有符號數

前提:ui = 130;

si = ui;

結果:si = -126;

130的原碼是:1000 0010,最高位為1,對其取補碼為1111 1110,所以si = 1111 1110 值得到的結果是-126。

2.有符號數--->無符號數

首先判斷有符號數的最高位是否為1,如果不為1,則無符號數就直接等於有符號數;如果有符號數的最高位為1,則將有符號數取補碼,得到的數就是

無符號數。

本質上是有符號數在儲存器中的二進位制數直接按照無符號數來解析,

2.1 將有符號數3轉為無符號數

前提:si = 2;

ui = si;

結果:ui = 2;

2的原碼是:0000 0010,可知最高位不為1,因此ui = 0000 0010。

2.2 將有符號數-2轉為無符號數

-2的在儲存器中按補碼存放的,二進位制表示為:1111 1110,此二進位制數按照無符號數解析也就是首位不再表示符號則該值為254。

前提:si = -2;

ui = si;

結果:ui = 254;

另外,上述以char舉例,如果換成short或者int等等,要注意只有首位才是符號位。

有符號數和無符號數相互轉換問題

平時工作中有符號數用的少,昨天同事在現場更改 需要用到有符號數,發回家裡後一下子我也有點暈,又查查資料在iar和vs中也驗證了下,做好 如下記錄。c語言中無符號數和有符號數一起比較 運算時,有符號數會隱式轉換到無符號數。1 無符號數 有符號數 首先判斷無符號數的最高位是否為1,如果不為1,則有符號數...

有符號數和無符號數的轉換問題

最近做了乙個專案,需要高八位和低八位的資料顛倒一下,需要轉換的資料是有符號的16位資料,我編寫的函式如下 16bit資料高低位互換程式 int16 rearrange16 int16 data 後來發現乙個問題 送出來的資料都沒有負數,正常情況下是正負都有的,經過除錯發現了問題所在,現在把我的心 得...

有符號數和無符號數

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