c語言中負數除法和右移的區別

對于無符號整數,除法和右移效果是一樣的;
對于有符號的正整數,除法和右移的效果也是一樣的;
對于有符號的負整數,除法和右移的效果是不一樣的;
比如:-3/2 = -1;-3>>1是多少呢?
我們可以將其按照8位二進制展開-3的8位二進制是1000 0011,負數在計算機中是以補碼的形式存儲的,所以還需要將其轉換成補碼1000 0011
轉換成反碼 1111 1100(最高位符號位不動), 再加1轉換成補碼1111 1101
接著將其右移1位,由于是有符號負整數,所以最高位補1,變為1111 1110
接著將其還原成原碼,1111 1110減1變反碼1111 1101,接著反碼取反變原碼1000 0010,轉換成十進制是-2,
也就是說-3>>1得到的是-2
其實這是因為除法是向0取整,而右移位是向負取整
-3/2=-1.5=-1(向0取整),-3>>1=-1.5=-2(向負取整);
如果我們需要右移達到的效果和除法一樣,可以采取下列公式:
假設除數為2^N,負數x的除法可以用以下方法來代替:(x + 2^N - 1) >> N


本文來自 西門一雪 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/liubo_10184653/article/details/80500418?utm_source=copy

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容