本文首發於深刻淺出區塊鏈社區
原文連接:智能合約語言 Solidity 教程系列2 - 地址類型介紹原文已更新,請讀者前往原文閱讀html
如今的Solidity中文文檔,要麼翻譯的太爛,要麼太舊,決定從新翻譯下。
尤爲點名批評極客學院名爲《Solidity官方文檔中文版》的翻譯,機器翻譯的都比它好,你們仍是別看了。編程
Solidity是以太坊智能合約編程語言,閱讀本文前,你應該對以太坊、智能合約有所瞭解,
若是你還不瞭解,建議你先看以太坊是什麼
Solidity教程會是一系列文章,本文是第一篇:介紹Solidity的變量類型。
Solidity 系列完整的文章列表請查看分類-Solidity。數組
本文前半部分是參考Solidity官方文檔(當前最新版本:0.4.20)進行翻譯,後半部分是結合實際合約代碼實例說明類型的使用(僅針對專欄訂閱用戶)。編程語言
Solidity是一種靜態類型語言,意味着每一個變量(本地或狀態變量)須要在編譯時指定變量的類型(或至少能夠推倒出類型)。Solidity提供了一些基本類型能夠用來組合成複雜類型。函數
Solidity類型分爲兩類:學習
值類型包含:區塊鏈
函數類型及 地址類型(Address)有單獨的博文,請點擊查看。
布爾(bool):可能的取值爲常量值true和false。ui
布爾類型支持的運算符有:編碼
注意:運算符&&和||是短路運算符,如f(x)||g(y),當f(x)爲真時,則不會繼續執行g(y)。翻譯
int/uint: 表示有符號和無符號不一樣位數整數。支持關鍵字uint8 到 uint256 (以8步進),
uint 和 int 默認對應的是 uint256 和 int256。
支持的運算符:
說明:
注意:Solidity中,右移位是和除等價的,所以右移位一個負數,向下取整時會爲0,而不像其餘語言裏爲無限負小數。
注意:定長浮點型 Solidity(發文時)還不徹底支持,它能夠用來聲明變量,但不能夠用來賦值。
fixed/ufixed: 表示有符號和無符號的固定位浮點數。關鍵字爲ufixedMxN 和 ufixedMxN。
M表示這個類型要佔用的位數,以8步進,可爲8到256位。
N表示小數點的個數,可爲0到80之間
支持的運算符:
注意:它和大多數語言的float和double不同,M是表示整個數佔用的固定位數,包含整數部分和小數部分。所以用一個小位數(M較小)來表示一個浮點數時,小數部分會幾乎佔用整個空間。
關鍵字有:bytes1, bytes2, bytes3, ..., bytes32。(以步長1遞增)
byte表明bytes1。
支持的運算符:
移位運算和整數相似,移位運算的結果的正負取決於操做符左邊的數,且不能進行負移位。
如能夠-5<<1, 不能夠5<<-1
成員變量:
.length:表示這個字節數組的長度(只讀)。
根據經驗:
bytes用來存儲任意長度的字節數據,string用來存儲任意長度的(UTF-8編碼)的字符串數據。
若是長度能夠肯定,儘可能使用定長的如byte1到byte32中的一個,由於這樣更省空間。
也有人把Literals翻譯爲字面量
整型常量是有一系列0-9的數字組成,10進製表示,好比:8進制是不存在的,前置0在Solidity中是無效的。
10進制小數常量(Decimal fraction literals)帶了一個., 在.的兩邊至少有一個數字,有效的表示如:1., .1 和 1.3.
科學符號也支持,基數能夠是小數,指數必須是整數, 有效的表示如: 2e10, -2e10, 2e-10, 2.5e1。
數字常量表達式自己支持任意精度,也就是能夠不會運算溢出,或除法截斷。但當它被轉換成對應的很是量類型,或者將他們與很是量進行運算,則不能保證精度了。
如:(2*800 + 1) - 2*800的結果爲1(uint8整類) ,儘管中間結果已經超過計算機字長。另外:.5 * 8的結果是4,儘管有非整形參與了運算。
只要操做數是整形,整型支持的運算符都適用於整型常量表達式。
若是兩個操做數是小數,則不容許進行位運算,指數也不能是小數。
注意:
Solidity對每個有理數都有一個數值常量類型。整數常量和有理數常量從屬於數字常量。全部的數字常表達式的結果都屬於數字常量。因此1 + 2和2 + 1都屬於一樣的有理數的數字常量3
警告:
整數常量除法,在早期的版本中是被截斷的,但如今能夠被轉爲有理數了,如5/2的值爲 2.5
注意:
數字常量表達式,一旦其中含有常量表達式,它就會被轉爲一個很是量類型。下面代碼中表達式的結果將會被認爲是一個有理數:
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的序列。
十六進制常量,以關鍵字hex打頭,後面緊跟用單或雙引號包裹的字符串,內容是十六進制字符串,如hex"001122ff"。
它的值會用二進制來表示。
十六進制常量和字符串常量相似,也能夠轉換爲字節數組。
在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); } }
經過合約代碼實例說明類型的使用,請訂閱區塊鏈技術查看。
咱們也推出了目前市面上最全的視頻教程:深刻詳解以太坊智能合約語言Solidity
目前咱們也在招募體驗師,能夠點擊連接瞭解。
深刻淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。