今天同事有個問題,基本情況就是當
operator
在gui
介面操作輸入了乙個非法值(例如乙個負值),居然沒有任何錯誤提示,導致最後
log中記錄的資訊讓人無法理解。從資訊的處理流程來看,沒有任何問題。後來發現是因為程式中有乙個計算步驟是用乙個
unsigned int
和輸入的數值作了乙個相加,然後再對計算結果大小進行判斷。由於輸入的是負數,負數和
unsigned int
做算術運算時,被自動轉換為了乙個大整數,計算的結果肯定也不正確了。
這讓我想到了曾經的乙個筆試題,大概是這樣的:
下面的程式的結果是什麼:
intfun()
正確答案:
1。原因就是
int b
本身是有符號書
-100
。但是當它和無符號整數
a做計算時,他就被自動轉化為無符號整數了。也就是說,本身
-100
是:0xffffff9c
,符號位為全
1。但是作為無符號數,
-100
就成為乙個碩大的正整數(好像是
18446744073709551516
),因此
a+b得到的結果也是乙個碩大的正整數。
問題解決了,那就回憶一下
c/c++
裡面資料型別自動轉換的規則: 1
,表示式中,所有小於整型的有序型別的變數在計算之前都會被轉換成整型。
char
和short
型別的值,無論有無符號,在計算時都自動轉換成
int或者
unsigned int
。enum
型別也同樣。 2
,表示式中的資料如果遇到更高階別的資料,就會自動轉換為高階別的資料型別。如果我們「定義」乙個資料型別表示的範圍越大,這個型別的級別越「高」。那麼按照從高到低的順序排列,應該是:
long double > double > float > unsigned long long > long long > unsigned long > long > unsigned int > int
(注意,有的系統中,
long
和int
大小相同,此時
unsigned int
的等級就會高於
long)。
3,賦值語句中,等號右邊的值會在運算之前自動轉換為等號左邊變數的資料型別,然後才開始計算。這個過程可能導致右邊的值轉為級別更高的資料型別,也可能「降級」。通常「降級」的時候,編譯器都會給乙個
warning
提示資料可能會被截斷。 4
,對於函式,在引數傳遞時,傳入的資料型別會轉換為形參的型別;返回的時候,返回的表示式型別也會自動轉換為函式返回型別。 5
,型別轉換改變的是值得型別,而不是物件的型別。例如開頭的例子中,只是在計算的時候將
-100
的值變為
unsigned int
來計算,本身
a這個變數沒有變!
以上是小弟的總結,能力有限,如有不對之處,敬請原諒並指正。
java 中型別轉換規則
首先boolean不能跟其他型別轉換。1.賦值時 整數預設的是int 浮點預設是double,即整型等號右側全部自動轉化為int,浮點型等號右側自動轉換為double。當大容量的資料型別賦值給小容量的資料型別時 需要強制型別轉換但是有乙個特例 例 byte b1 3 是沒有錯誤的,因為等號右邊如果是...
js資料型別轉換規則
數值型別 轉字串,直接轉成對應值的字串 轉布林,0 和 nan轉成false,其他值轉成true 在需要時會自動的轉成對應值的包裝物件 字串 空字串 轉數字為 0,轉布林為 false 非空純數字字串 123 轉數字為對應值的數值,轉布林 true 非空非數字字串 abc 轉數字為nan,轉布林是t...
Java資料型別轉換規則
1 型別轉換主要在在 賦值 方法呼叫 算術運算 三種情況下發生。a 賦值和方法呼叫 轉換規則 從低位型別到高位型別自動轉換 從高位型別到低位型別需要強制型別轉換 1 布林型和其它基本資料型別之間不能相互轉換 2 byte型可以轉換為short int long float和double 3 shor...