-
1 # Toshiba88
-
2 # 帖木兒
問出這個問題來說明你這個C程式設計師是不合格的。
你只知道C裡有"unsigned"型別,卻不知道這種資料的儲存方式。
事實上,不論unsigned還是signed,整型資料的儲存方式都是完全一樣的,都是補碼錶示法,是不是signed無關,跟±運算也無關。
比如簡單一點,一個8位整數,unsigned是0-255,signed是-128~127。兩者的儲存方式完全相同,±運算也完全相同。區別是你看資料時的理解方式,比如8位全1,unsigned 理解為255(再+1變成0),而signed理解為-1(再+1也是0)。這就是補碼錶示法的精髓,有無符號無差別,甚至加減法也幾乎無差別:補碼錶示下,減法就是取反+1。你可以在C或java程式碼裡驗證:a-b,和a+(~b)+1,二者是一樣的。
回到題主的問題,當然先要明確程式設計師需要unsigned型別的原因和用途,不過據我的經驗,通常都只是用來計數,也只涉及到加減法和比較(比大小就是減法)。一般來說,直接改成signed就好,加減法照常使用,唯一的,在做比較時,需要稍稍處理一下,比如:
兩個整數a,b用int儲存(實際是unsigned,可能超2³¹,此時int會理解為負數),兩者比大小不要直接if(a<b),要改成:
int c=a-b;
if(c<0)
…
-
3 # 天一閣圖書管理員
啊?作為一名C程式設計師,我不明白你為什麼會提出這種問題。那麼請問,如果大整數超過int64在C裡面怎麼辦啊,這C語言它也沒提供。
-
4 # IT之州
題主沒有理解Java的設計意圖。
Java的主要設計目標之一是使程式碼在語言層面儘量減少隱患,規避業界已知的常見問題。體現在具體設計上,題主提到了兩個例子。
第一個,Java的資料型別中沒有無符號整數型別,是為了規避無符號整數型別帶來的隱患。即便是C語言,長者常常告誡新學者,儘量別用無符號整數。經過幾十年的實用經驗,公認的看法是無符號整數型別弊大於利。所以,Java棄之不用。
第二,Java語言中不見指標。Java設計師決定將指標“隱藏”起來,不給程式設計者直接使用。取而代之是用建立了抽象層來間接使用“指標”。Java的動機是透過“消滅”指標來規避相當數量的常見程式錯誤和隱患。
既然用Java,那就用Java來思維,不能看著碗裡,想著鍋裡。C語言縱有千般好,可你在用Java了,千萬別試圖去寫C味的Java程式碼。
相關內容
- c語言程式設計,假設x是一個整數,寫一個程式:從鍵盤上輸入它的值,計算y=2x+5,並輸出y的值?
- c語言大神進,輸入函式scanf語句在鍵盤上輸入整數時,例如scanf("%d%d%d"?
- 輸入任意個整數,降序排列,用C語言程式設計解決?
- c語言,從鍵盤輸入兩個整數?
- c語言,求最小值:輸入一個正整數n,再輸入n個整數?
- 一道C語言題目,有3個整數a,b,c,由鍵盤輸入,輸出其中最大的數,請編寫程式?
- 求大神⊙▽⊙ C語言程式,從鍵盤任意輸入10個整數,統計並輸出其中非負數的個數,以及計算並輸出非?
- C語言中比long long int更大的整數型別是什麼?
- c語言程式設計中如何判斷一個數是否為整數?
- 從鍵盤任意輸入一個整數n,程式設計計算並輸出1~n之間的所有素數之和我編的這個程式怎麼錯了(C語言)?
理解了面向物件,就解了這個問題。你為什麼需要一個無符號整數。記錄年齡?那應該是個Age物件。計數器?那應該是個Counter物件。。C的無符號整型更多是在記憶體受限(C誕生的年代背景,以及在嵌入式開發的廣泛使用)情況下提供更精細的空間控制。但對於Java來說這些就沒有那麼強烈。業務場景不能接受負值應該用封裝來解決,資料範圍不夠換成long就好了。