1. 程式人生 > >智慧合約語言 Solidity 型別介紹

智慧合約語言 Solidity 型別介紹

想知道更多區塊鏈技術相關問題,請百度【鏈客區塊鏈技術問答社群】

Solidity是以太坊智慧合約程式語言,閱讀本文前,你應該對以太坊、智慧合約有所瞭解,畢竟如果你不是很瞭解的話,未必知道本篇是講的什麼,So,萌新就不要來看了,很高深哦~哈哈,開個小玩笑。

型別
Solidity是一種靜態型別的語言,也就是說需要在編譯時指定變數的型別,是一種面向物件的語言。但作為一種真正意義上執行在網路上的去中心合約。其可以提供基礎的來組合成複雜的型別。
Solidity型別分為兩類:
1.值型別: 變數在賦值或傳參時,總是進行值拷貝。
2.引用型別
值型別(Value Type)
值型別包含:
布林型別(Booleans)
整型(Integers)
定長浮點型(Fixed Point Numbers)
定長位元組陣列(Fixed-size byte arrays)
有理數和整型常量(Rational and Integer Literals)
字串常量(String literals)
十六進位制常量(Hexadecimal literals)
列舉(Enums)
函式型別(Function Types)
地址型別(Address)
地址常量(Address Literals)
1
布林型別(Booleans)
布林(bool):可能的取值為常量值true和false。
布林型別支援的運算子有:
!邏輯非
&& 邏輯與
|| 邏輯或
== 等於
!= 不等於
注意:運算子&&和||是短路運算子,如f(x)||g(y),當f(x)為真時,則不會繼續執行g(y)。

整型(Integers)
int/uint: 表示有符號和無符號不同位數整數。支援關鍵字uint8 到 uint256 (以8步進),
uint 和 int 預設對應的是 uint256 和 int256。
支援的運算子:
比較運算子: <=, < , ==, !=, >=, > (返回布林值:true 或 false)
位操作符: &,|,^(異或),~(位取反)
算術操作符:+,-,一元運算-,一元運算+,,/, %(取餘數), (冪), << (左移位), >>(右移位)
說明:
整數除法總是截斷的,但如果運算子是字面量(字面量稍後講),則不會截斷。
整數除0會拋異常。
移位運算的結果的正負取決於操作符左邊的數。x << y 和 x 2

y 是相等, x >> y 和 x / 2**y 是相等的。
不能進行負移位,即操作符右邊的數不可以為負數,否則會丟擲執行時異常。
注意:Solidity中,右移位是和除等價的,因此右移位一個負數,向下取整時會為0,而不像其他語言裡為無限負小數。
有理數和整型常量(Rational and Integer Literals)
也有人把Literals翻譯為字面量
整型常量是有一系列0-9的數字組成,10進製表示,比如:8進位制是不存在的,前置0在Solidity中是無效的。
10進位制小數常量(Decimal fraction literals)帶了一個., 在.的兩邊至少有一個數字,有效的表示如:1., .1 和 1.3.
科學符號也支援,基數可以是小數,指數必須是整數, 有效的表示如: 2e10, -2e10, 2e-10, 2.5e1。
數字常量表達式本身支援任意精度,也就是可以不會運算溢位,或除法截斷。但當它被轉換成對應的非常量型別,或者將他們與非常量進行運算,則不能保證精度了。
如:(2800 + 1) - 2
800的結果為1(uint8整類) ,儘管中間結果已經超過計算機字長。另外:.5 * 8的結果是4,儘管有非整形參與了運算。
只要運算元是整形,整型支援的運算子都適用於整型常量表達式。
如果兩個運算元是小數,則不允許進行位運算,指數也不能是小數。
注意:
數字常量表達式,一旦其中含有常量表達式,它就會被轉為一個非常量型別。下面程式碼中表達式的結果將會被認為是一個有理數:
uint128 a = 1;uint128 b = 2.5 + a + 0.5;
上述程式碼編譯不能通過,因為b會被編譯器認為是小數型。
字串常量
字串常量是指由單引號,或雙引號引起來的字串 (“foo” or ‘bar’)。字串並不像C語言,包含結束符,”foo”這個字串大小僅為三個位元組。和整數常量一樣,字串的長度型別可以是變長的。字串可以隱式的轉換為byte1,…byte32 如果適合,也會轉為bytes或string。
字串常量支援轉義字元,比如\n,\xNN,\uNNNN。其中\xNN表示16進位制值,最終轉換合適的位元組。而\uNNNN表示Unicode編碼值,最終會轉換為UTF8的序列。
十六進位制常量(Hexadecimal literals)
十六進位制常量,以關鍵字hex打頭,後面緊跟用單或雙引號包裹的字串,內容是十六進位制字串,如hex”001122ff”。
它的值會用二進位制來表示。
十六進位制常量和字串常量類似,也可以轉換為位元組陣列。
列舉(Enums)
在Solidity中,列舉可以用來自定義型別。它可以顯示的轉換與整數進行轉換,但不能進行隱式轉換。顯示的轉換會在執行時檢查數值範圍,如果不匹配,將會引起異常。列舉型別應至少有一名成員。下面是一個列舉的例子:
pragma solidity ^0.4.0;

contract test {
enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }
ActionChoices choice;
ActionChoices constant defaultChoice = ActionChoices.GoStraight;

function setGoStraight() {
    choice = ActionChoices.GoStraight;
}

// Since enum types are not part of the ABI, the signature of "getChoice"
// will automatically be changed to "getChoice() returns (uint8)"
// for all matters external to Solidity. The integer type used is just
// large enough to hold all enum values, i.e. if you have more values,
// `uint16` will be used and so on.
function getChoice() returns (ActionChoices) {
    return choice;
}

function getDefaultChoice() returns (uint) {
    return uint(defaultChoice);
}

}