型別轉換的規則

2021-04-15 07:04:10 字數 1547 閱讀 6269

今天同事有個問題,基本情況就是當

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...