3.8 solidity資料型別詳解

尹成發表於2018-11-08

1. 值型別:以下型別在傳值時採用值傳遞

        a. 布林(Booleans):

            i. bool可能取值為常量true和false、在不初始化的情況下,預設為false。

            ii. 支援運算子有 邏輯非(!)、邏輯與(&&)、邏輯(||)、等於(==)、不等於(!=)

            iii. 運算子&&和||是短路運算子,如f(x)||g(y),當f(x)為真時,則不會繼續執行g(y)

            iv. bool與條件語句

        b. 整型(Integer):

            i. 變長的有符號或無符號整型。變數支援的步長以8遞增,支援從uint8到uint256,以及int8到int256。需要注意的是,uint和int預設代表的是uint256和int256。

            ii. 支援的運算子

                1. 比較:<=,<,==,!=,>=,>,返回值為bool型別

                2. 位運算:&,|,(^異或),(~非)

                3. 數學運算:+,-,*,/,(%求餘),(**乘方)

            iii. 注意 solidity不支援8進位制

            iv. 整形的上溢和下溢

                1. 如果一個整形變數的值達到了它的最大值,再加一個大於0的數會變成0

                2. 如果一個整形變數的值達到了它的最小值,再減一個大於0的數會變成它的最大值

                3. 比如 uint8 a = 255 那麼a + 1 = 0; uint8 b = 0, b - 1 = 255;

        c. 小數

            i. 字面量:如果字面量計算的結果不是一個整數,那麼將會轉換為一個對應的ufixed,或fixed型別。Solidity會選擇合適的大小,以能儘量包含小數部分

            ii. 運算子:適用於整型的操作符,同時適用於數字的字面量運算表示式,當操作結果是整數時。如果有任何一方是有理數,將不允許使用位操作符。如果指數是小數,還將不能進行取冪運算

            iii. 二進位制表示:大多數含小數的十進位制,均不可被二進位制準確表達,比如5.3743的型別可能是ufixed8*248。如果你想使用這樣的值,需要明確指定精度x + ufixed(5.3743),否則會報型別轉換錯誤

            iv. 截斷:在當前版本中沒有截斷,5/2=2.5

            v. 字面量轉換:數字的字面量表示式,一旦其中含有非字面量表示式,它就會被轉為一個非字面量型別

    2. 引用型別:以下型別在傳值時採用引用傳遞

        a. 不定長位元組陣列(bytes)

        b. 字串(string)

        c. 陣列(Array)

        d. 結構體(Structs)

    3. 基本型別之間的型別轉換

        a. 隱式

            i. 如果運算子支援兩邊不同的型別,編譯器會嘗試隱式轉換型別,同理,賦值時也是類似。通常,隱式轉換需要能保證不會丟失資料,且語義可通。如uint8可以轉化為uint16,uint256。但int8不能轉為uint256,因為uint256不能表示-1。

            ii. 此外,任何無符號整數,可以轉換為相同或更大大小的位元組值。比如,任何可以轉換為uint160的,也可以轉換為address。

        b. 顯示

            i. 如果不允許隱式型別轉換,確保可以轉換時可以採用強轉

            ii. 注意如果由一個大的型別(uint32)轉換為小的型別(uint16),高位會被截斷

        c. 型別推斷

            i. 使用var可以在第一次賦值的時候推斷變數的型別,但不能用於函式的引數

            ii. Var 可以用來把函式賦值給一個變數

            iii. 注意 有時個 var會推斷出錯誤的型別

 

相關文章