close







c語言 如何作負數的轉換??




立即點擊


負數的轉換請教一下-918轉成用兩個8位元暫存表示-918/256=-3(高位元)-918%=150(低位元)我用一個16位元的位置有存起來intsub;sub=(-3*256)|(這是or)246<--這樣對嗎?因為我用手算-3*256=11111101000000001111110100000000or(|)10010110=-618我到底是那個環節錯了





正確答案是 1111 1100 0110 1010 可由(標準算法) -918 ===> 918 918 = 3 * 256 150 = 0000 0011 1001 0110 0000 0011 1001 0110 ==(2補數)=> 1111 1100 0110 1010 算出。 1111 1100 = 252 或 -4,並非 -3 0110 1010 = 106 並非 150 (150 106 = 256) 負數能不能像你那樣做,我不知道! 所以,可能可以這樣算: -X = - (a *256 b) m = -a-1 n = 256 - b (取得 1補數) m << 8 | n 得到答案。 你試試看。 不過,沒事不建議使用非標準算法。 2007-10-10 15:10:00 補充: + 又被吃光了!:S 150 + 106 = 256 a * 256 + b 正中間的〝所以〞,應該是〝不過〞才對。 另外,在 C,那列應該要加 ( ) (m << 8 ) | n 2007-10-10 21:58:47 補充: | 可以吧! xxxx xxxx 0000 0000 | 0000 0000 yyyy yyyy 比加快耶! 2007-10-11 11:11:18 補充: 那個 +-150 也好、+- 106 也罷,不是第一組數值,不用 帶負旗標。 問題是:能不能用 1 補數去理解? 要把它想成 -yyy,就會像藍水晶一樣:不能用 or,只能用 + 問題是:+ 比 or 慢! 所以,我能用 or 把它 掰 出來,應該是有解決之道。 只要能確定可以用 1 補數去表示非第一組數值,再把第一組數值 -1, 就可以表示那整個數值的話,就可以用類似的算法。 當然,我還是支持標準算法; 而下週一有三個作業、下週五期中考; 沒空好好想、證明。 證明就留給有空的有心人囉! 2007-10-11 11:14:35 補充: OR 會比 + 快,因為 OR 可以所有的 bits 同時算;+ 不行 所以,遇到 OR 和 ADD / ADC 一樣速度的 CPU, 應該是為了擠進 cycle 裡,OR 有空等。 2007-10-13 14:07:22 補充: 你說的應該是Systolic array的加法器吧!? 它是不用等沒錯;但通常用在 DSP 上。 CPU 上有沒有用,我也不知道。 但它還是沒有 OR 快。(OR 是基本邏輯匣。) 而且,天下沒有白吃的午餐。 要用一群複雜的東東和OR 是基本邏輯匣拚速度 就算有詭異的電路問世,可以辦到; 它一定比基本單一邏輯匣耗電! 所以,能用 OR 解決的,我就不用 + 。





LogicalOR會比加法快嗎?為什麼?我還以為是一樣快的2007-10-1223:32:21補充:很rusty了…但記得以前在學設計CPU課時,最基本的ripper-carryadder會有你說的問題(adder需要數個propagationdelay才能將答案算出來,因為是1個bit的carrylink到下一個bit),但記得老師有說過可以用比較複雜的電路,設計只要一個propagationdelay的adder…這樣的adder應該是跟logicor一樣快的…(但我不確定目前的CPU是否是這樣作)-918/256=-3-918%256=-150所以-3*256+(-150)=-918但是8位元是沒有辦法用來表示-150Lee的算法是標準的,至於非正統的頭腦体操,問題在-918%=150<==是-150用16位元表示1111110100000000or(|)10010110=-618<==or也是錯的要用加法1111110100000000+1111111101101010=1111110001101010


以上文章來自奇摩知識家,如有侵犯請留言告知


https://tw.answers.yahoo.com/question/index?qid=20071010000010KK04614

C902071D09AF7660
arrow
arrow

    「最美麗主持人」 發表在 痞客邦 留言(0) 人氣()