c語言中為什麼左移不分符號數無符號數,而右移分呢

2021-03-07 01:33:27 字數 1916 閱讀 6657

1樓:手機使用者

因為在c語言標準中,只規定了無符號數的移位操作是採用邏輯移位(即左移、右移都是使用的邏輯左移和邏輯右移)。

而對於有符號數,其左移操作還是邏輯左移,但右移操作是採用邏輯右移還是算術右移就取決於機器了!(算術右移和邏輯右移的區別是:算術右移不右移符號位,即最高位,右移後前補0還是1取決於符號位的值;邏輯右移執行時將移動符號位,右移後前補0)

因此,一個程式如果使用了有符號數的右移位操作,它就是不可移植的了。

2樓:

左移時是不區分無符號數的,而進行右移時也不區分是否是無符號,移進的值在最高位補0。

例如:0xff進行右移一位0xff>>1,其結果為0x7f,請參見以下**:

#include

int main()

執行結果為:a = 7f

3樓:10伯樂

計算機中存放的是二進位制補碼錶示的,正數的補碼是本身,而負數的補碼是取反加1.

所以負數的補碼在求其真值是也是對其作取補運算。

左移、右移其實就是乘或除2,這個不影響符號,所以負數的右移補符號位,保證是負數。

這只是大道理,您自己推一下就很容易理解了。

4樓:匿名使用者

因為左移定義是,每個移出的位進入進位標誌,右邊填充0,無論是有符號數還是無符號數都這麼操作,這是規定。那麼,這樣的操作對有符號數和無符號數的結果都是一樣的,所以左移不分有符號數還是無符號數。

左移賦值 有符號右移賦值 無符號右移賦值 分別什麼意思?請舉例說明,越詳細越好啊

5樓:匿名使用者

有符號數和無符號數,主要是將資料轉成2進位制後,第一位的意義,有符號數第一位為符號位,1表示負數,0表示整數。無符號數第一位都是0

c語言位移(左移右移有無符號)之後可以返回原值麼?

6樓:匿名使用者

左移右移並不會改變原值,例如

int a = 1;

a<<2;

printf("%d", a); //輸出還是1如果你問的是

int a=1;

a=a<<2;

a=a>>2;

那麼最終a的值還是1

但是如果溢位了就移不回來了

c語言中為什麼左移不分符號數無符號數,而右移分呢??

7樓:校和雅洪羨

因為在c語言標準中bai,只du規定了無符號數的移zhi位操作是採用邏輯dao移位(即左移、右移都是使回用的邏輯答左移和邏輯右移)。

而對於有符號數,其左移操作還是邏輯左移,但右移操作是採用邏輯右移還是算術右移就取決於機器了!(算術右移和邏輯右移的區別是:算術右移不右移符號位,即最高位,右移後前補0還是1取決於符號位的值;邏輯右移執行時將移動符號位,右移後前補0)

因此,一個程式如果使用了有符號數的右移位操作,它就是不可移植的了。

8樓:儲熠祖波

可能是書上印錯了

還有「而1左移2位也就是1乘以4等於4

也就是0000

1000

」這個好象是左移了3位了~~

9樓:闢歌韻商聽

計算機中存放的抄是二進位制補碼錶示的,正數的補碼是本身,而負數的補碼是取反加1.

所以負數的補碼在求其真值是也是對其作取補運算。

左移、右移其實就是乘或除2,這個不影響符號,所以負數的右移補符號位,保證是負數。

這只是大道理,您自己推一下就很容易理解了。

c語言怎麼實現無符號右移

10樓:匿名使用者

無符號數右移

直接用》就可以了

比如a>>2

就是右移兩位。

如圖C語言程式,這個定義無符號數a,但是賦了66666的負數,但是為什麼列印輸出也是負數

你好是這樣子的你是以無符號存放的沒錯 但是輸出無符號的格式是 u d是有符號整數輸出的格式 希望能幫助到你 d 格式 bai 輸出,就是把 數值du 轉換 為 有符號數 輸出zhi。unsigned int a 66666 內部是dao 0xfffefb96 按 無符號內 輸出 要用 格式 u.體會...

c語言中定義無符號整型變數有什麼作用

整型有無bai 符號 unsigned 和有符號 signed 兩種du型別,在預設情況下聲zhi明的dao整型變數都是有符號的型別 版char有點特別 如果需聲 權明無符號型別的話就需要在型別前加上unsigned。無符號版本和有符號版本的區別就是無符號型別能儲存2倍於有符號型別的資料,比如16位...

c語言中同或用什麼符號表示,c語言中「或者」用什麼符號表示?

c語言中不提供 同或 運算,似乎只有異或,異或得反就是同或 c語言中 或者 用什麼符號表示?c語言中,表示 或 有兩種 表示按位或 表示邏輯或 例如 c語言中 同或用什麼符號表示 c語言中不提供 同或 運算,似乎只有異或,異或得反就是同或 c語言中同或 異或怎麼表示 異或有專門的操作符 比如int ...