Solidity語言學習筆記————11、隱式轉換和顯式轉換

FLy_鵬程萬里發表於2018-06-22

隱式轉換(Implicit Conversions)

如果將一個運算子應用於多個不同型別,編譯器會試圖隱式地把其中一個運算元的型別轉換為另一個運算元的型別。賦值操作在同樣的情況下也會這樣。

一般來說,如果轉換後不會造成資訊會丟失,會自動進行隱式轉換:

  • unt8可轉換成uint16, int128, int256
  • int8不能轉換成uint256,因為uint256放不下負數
  • 無符號整數可以轉換成相同或更大的尺寸的bytes , 但反過來不行
  • 任何可以轉化為uint160的型別,也可以轉換為address

顯式轉換(Explicit Conversions)

如果編譯器不允許某種隱式轉換,但你可以手動顯式轉換

int8 y = -3;
uint x = uint(y);

這個程式碼片段結尾 ,x的值是0xfffff . .fd(64個十六進位制字元)——-3在256位的二進位制補碼錶示。

如果一個型別被顯式轉換為一個更小的型別,高階位將被移除

uint32 a = 0x12345678;
uint16 b = uint16(a); // b會變成0x5678

型別推導(Type Deduction)

為方便起見,並不總是需要顯式地指定一個變數的型別。編譯器會自動從第一個賦值表示式的變數型別裡推斷出新變數的型別:

uint24 x = 0x123;
var y = x;
這裡y的型別是uint24。對於函式引數或返回值不能使用var

警告
這個型別僅僅是從第一次賦值推導得出的,所以以下程式碼是死迴圈
for (var i = 0;< 2000;i+ +){ 

   ......

}
因為 i 的型別是uint8, 這種型別的任何值都小於2000


相關文章