1樓:校和雅洪羨
因為在c語言標準中bai,只du規定了無符號數的移zhi位操作是採用邏輯dao移位(即左移、右移都是使回用的邏輯答左移和邏輯右移)。
而對於有符號數,其左移操作還是邏輯左移,但右移操作是採用邏輯右移還是算術右移就取決於機器了!(算術右移和邏輯右移的區別是:算術右移不右移符號位,即最高位,右移後前補0還是1取決於符號位的值;邏輯右移執行時將移動符號位,右移後前補0)
因此,一個程式如果使用了有符號數的右移位操作,它就是不可移植的了。
2樓:儲熠祖波
可能是書上印錯了
還有「而1左移2位也就是1乘以4等於4
也就是0000
1000
」這個好象是左移了3位了~~
3樓:闢歌韻商聽
計算機中存放的抄是二進位制補碼錶示的,正數的補碼是本身,而負數的補碼是取反加1.
所以負數的補碼在求其真值是也是對其作取補運算。
左移、右移其實就是乘或除2,這個不影響符號,所以負數的右移補符號位,保證是負數。
這只是大道理,您自己推一下就很容易理解了。
c語言中為什麼左移不分符號數無符號數,而右移分呢??
4樓:手機使用者
因為在c語言標準中,只規定了無符號數的移位操作是採用邏輯移位(即左移、右移都是使用的邏輯左移和邏輯右移)。
而對於有符號數,其左移操作還是邏輯左移,但右移操作是採用邏輯右移還是算術右移就取決於機器了!(算術右移和邏輯右移的區別是:算術右移不右移符號位,即最高位,右移後前補0還是1取決於符號位的值;邏輯右移執行時將移動符號位,右移後前補0)
因此,一個程式如果使用了有符號數的右移位操作,它就是不可移植的了。
5樓:
左移時是不區分無符號數的,而進行右移時也不區分是否是無符號,移進的值在最高位補0。
例如:0xff進行右移一位0xff>>1,其結果為0x7f,請參見以下**:
#include
int main()
執行結果為:a = 7f
6樓:10伯樂
計算機中存放的是二進位制補碼錶示的,正數的補碼是本身,而負數的補碼是取反加1.
所以負數的補碼在求其真值是也是對其作取補運算。
左移、右移其實就是乘或除2,這個不影響符號,所以負數的右移補符號位,保證是負數。
這只是大道理,您自己推一下就很容易理解了。
7樓:匿名使用者
因為左移定義是,每個移出的位進入進位標誌,右邊填充0,無論是有符號數還是無符號數都這麼操作,這是規定。那麼,這樣的操作對有符號數和無符號數的結果都是一樣的,所以左移不分有符號數還是無符號數。
c語言中為什麼不能將無符號整數與有符號整數比較
8樓:匿名使用者
計算機組成原理有 有符號整數的最高位是1,無符號則可能為1可能為0,如果為0,比較會出錯。
9樓:
不是不能比,是你未比出正確結果,兩個數的區間不一樣,可以內碼內卻有可能相同,你得如此
容比法,例如:
int si;
unsigned int ui;
ui = si = -100;
int res = (si<0) ? -1 : (ui>>31) ? 1 : (ui-si);
當有符號數小於0時,不用比,總是有符號的小,當無符號數最高位為1時不用比,總是無符號位大,有符號數不小於0而無符號數最高位不是1時才做比較,就可以得出正確結果
10樓:匿名使用者
沒這一說吧bai
int main()
以上會輸出du a>b
因為在無符號zhi與有符號數進行運dao算內時(計算機中容的運算,非數學意義上的運算),系統會自動將有符號數看成(也可以叫轉換,實際沒有轉換)無符號數,然後進行比較。
舉例:假定一個數是8位,一個位元組表示
-1=11111111(補碼),相當於無符號數25510=00001010
c語言中,unsigned不應該是無符號數嗎?為什麼還是可以顯示負數?
11樓:匿名使用者
顯示成有符號還是無符號,是根據printf的格式化引數來決定的。
%d是按照有符號輸出,%u是按照無符號輸出。
如圖 C語言程式中無符號數a的值是負數,為什麼作整形輸出時的結果是
負數在記憶體中是以補碼的形式儲存的,即 666 原碼 1000 0010 1001 1010 反碼 1111 1101 0110 0101 符號位不變,其它位取反 補碼 1111 1101 0110 0110 反碼 1 即,實際記憶體中的資料為0b1111 1101 0110 0110 64870 ...
C語言有符號和無符號的有什麼不同啊
有符號數如果高位為1,則為負數的補碼。對於一個有符號整數,c編譯程式將把該值 二進位制 的最高位作為符號標誌位 符號標誌位是0,表示正數 為1,表示負數 比如說整bai型變數吧。unsigned int 是從du0到2的zhi32次方dao減1,而signed int 是專 從負2的31次方到正2的...
C語言,我的程式為什麼執行不對,c語言中輸入一個程式後顯示無錯誤,為什麼不能執行
是陣列,本身就是地址,不必用 2 b進位制,每位上的數字最大值是b 1,因此,應該先檢視3個數各位的數字,取最大值 1作為b的最小值.3 注意,base在每次求1個數之前,要重新歸1。你求sum1,sum2,sum3前,都沒有歸1,base累積,越來越大。第一個base 1 應該在for i len...