兩種整數:1.非負數(unsigned)2.負數、0、正數 t:補碼 b:二進位制 u:無符號數
1.整數資料型別:(unsigned) char、short、int、long、int32_t、int64_t….
2.無符號數的編碼:假設位向量:x=[x[w-1],x[w-2],….,x[1],x[0]]
00 二進位制轉無符號數:b2u(x)=x[0]*2^0+x[1]*x^1+…+x[w-1]*2^(w-1)
00 很常規:u_max(w位)=2^(w)-1;(11…11) u_min=0;(00…00)
3.補碼編碼:最常見的有符號數的計算機表示方式。
00 二進位制轉有符號數:b2t(x)=-x[w-1]*2^(w-1)+x[0]*2^0+x[1]*2^1+…+x[w-2]*2^(w-2)
00 負數可看成其絕對值轉為二進位制後取反+1,最後再補上最高位的1
00 t_max(w位)=2^(w-1)-1(011…11) t_min(w位)=-2^(w-1)(100…00) (注意正數範圍和負數範圍是不對稱的)
00 對於確定位數整型的列印:printf(「%」 prid32」\n」, bar); printf(「%」 priu64」\n」, bar);….
00 有符號數的其他表示方法
0 ——1.反碼:b2o(x)=-x[w-1]*(2^(w-1)-1)+x[0]*2^0+x[1]*2^1+…+x[w-2]*2^(w-2)
0 ——0 直接取反,高位補1(正數都一樣,負數和補碼的區別在於比補碼大1)
0 ——2.原碼:b2s(x)=(-1)^x[w-1]*(x[0]*2^0+x[1]*2^1+…+x[w-2]*2^(w-2))
0 ——這兩種放法有乙個奇怪的屬性,數字0有兩種不同的編碼方式(100..00原)(111..11反)
4.有符號數和無符號數之間的轉換(即顯性轉換和隱性轉換)
00 處理同樣字長的有符號數和無符號數之間相互轉換:數值可能會變,但位不變(雙方都能表示的數都是一樣的)
00 t2u(x)=x+x[w-1]*2^w(即對於有符號數的正數不變,負數統一加上2^w)
00 u2t(u)=u-u[w-1]*2^w(對於〈=tmax(2^(w-1)-1)的無符號數不變,大於的統一減去2^w)
5.c語言中的有符號數與無符號數:c未指定有符號數用哪種表示,但幾乎所有的機器都用補碼
00 通常乙個數都是有符號的,要建立乙個無符號數常量,必須加上字尾字元u(u),比如12345u
00 c允許無符號數和有符號數之間的轉換,但沒有精確規定方法,但大多數系統遵循的原則是底層的位保持不變
00 用printf輸出時分別用%d,%u,%x以有符號十進位制、無符號十進位制和十六進製制格式進行輸出
00 當執行乙個運算,如果乙個運算數是有符號的,而另乙個是無符號的,此時c會隱式的把有符號數轉變為無符號數
00 ——(-1<0u)由於0是unsigned,所以會先把-1轉變位無符號數即x^(w)-1,所以這個判斷是錯的
6.擴充套件乙個數字的位表示(增大位數)
00 將乙個無符號數轉變為乙個更大的無符號數,簡單的在開頭添0即可(零擴充套件)
00 將補碼轉變為乙個更大的補碼,則在開頭添最高有效位的值(即非負數添0,負數添1)
7.擷取數字(減少位數)
00 截斷無符號位xmod2^k
00 截斷補碼數值:與無符號數一樣,只是將截斷後最高位轉換為符號位
8.當把字看成位的集合而不是數值時,無符號位很有意義,比如每個位存放bool的,位址自然數自然是無符號的
羅馬數表示整數
羅馬數字共有七個,即 i 1 v 5 x 10 l 50 c 100 d 500 m 1000 按照下面三條規則可以表示任意正整數。重複數次 乙個羅馬數字重複幾次,就表示這個數的幾倍。右加左減 在乙個較大的羅馬數字的右邊記上乙個較小的羅馬數字,表示大數字加小數字。在乙個較大的數字的左邊記上乙個較小的...
整數表示問題。
我們知道,如果x,y互素時ax by可以表示任意整數 其中a,b為整數 如果設定條件x,y 0,並且ax by 0時,求能表示的整數集中連續的整數最小的是多少?例如輸入x 3,y 4.整數集為0,3,4,6,7,8,9 則輸出6 輸入1行x和y,輸出一行表示最小整數 其中x,y為32位整數且互素。現...
整數表示法
整數表示法 題目詳情 我們知道,如果x,y互素時ax by可以表示任意整數 其中a,b為整數 如果設定條件x,y 0,並且ax by 0時,求能表示的整數集中連續的整數最小的是多少?例如輸入x 3,y 4.整數集為0,3,4,6,7,8,9 則輸出6 輸入1行x和y,輸出一行表示最小整數 其中x,y...