智能合約語言 Solidity 教程系列1 - 類型介紹

轉(zhuǎn)自:https://learnblockchain.cn/2017/12/05/solidity1/

類型

Solidity是一種靜態(tài)類型語言肤晓,意味著每個變量(本地或狀態(tài)變量)需要在編譯時指定變量的類型(或至少可以推倒出類型)。Solidity提供了一些基本類型可以用來組合成復(fù)雜類型翩隧。

Solidity類型分為兩類:

  • 值類型(Value Type) - 變量在賦值或傳參時妓布,總是進(jìn)行值拷貝姻蚓。
  • 引用類型(Reference Types)

值類型(Value Type)

值類型包含:

  • 布爾類型(Booleans)

  • 整型(Integers)

  • 定長浮點(diǎn)型(Fixed Point Numbers)

  • 定長字節(jié)數(shù)組(Fixed-size byte arrays)

  • 有理數(shù)和整型常量(Rational and Integer Literals)

  • 字符串常量(String literals)

  • 十六進(jìn)制常量(Hexadecimal literals)

  • 枚舉(Enums)

  • 函數(shù)類型(Function Types)

  • 地址類型(Address)

  • 地址常量(Address Literals)

    函數(shù)類型地址類型(Address)有單獨(dú)的博文,請點(diǎn)擊查看匣沼。

布爾類型(Booleans)

布爾(bool):可能的取值為常量值truefalse狰挡。

布爾類型支持的運(yùn)算符有:

  • !邏輯非
  • && 邏輯與
  • || 邏輯或
  • == 等于
  • != 不等于

注意:運(yùn)算符&&||是短路運(yùn)算符肛著,如f(x)||g(y)圆兵,當(dāng)f(x)為真時,則不會繼續(xù)執(zhí)行g(shù)(y)枢贿。

整型(Integers)

int/uint: 表示有符號和無符號不同位數(shù)整數(shù)殉农。支持關(guān)鍵字uint8uint256 (以8步進(jìn)),
uintint 默認(rèn)對應(yīng)的是 uint256int256局荚。

支持的運(yùn)算符:

  • 比較運(yùn)算符: <=, < , ==, !=, >=, > (返回布爾值:true 或 false)
  • 位操作符: &超凳,|愈污,^(異或),~(位取反)
  • 算術(shù)操作符:+轮傍,-暂雹,一元運(yùn)算-,一元運(yùn)算+创夜,*杭跪,/, %(取余數(shù)), ***(冪), << (左移位), >>(右移位)

說明:

  1. 整數(shù)除法總是截斷的,但如果運(yùn)算符是字面量(字面量稍后講)驰吓,則不會截斷涧尿。
  2. 整數(shù)除0會拋異常。
  3. 移位運(yùn)算的結(jié)果的正負(fù)取決于操作符左邊的數(shù)檬贰。x << y 和 x 2y 是相等姑廉, x >> y 和 x / 2y 是相等的。
  4. 不能進(jìn)行負(fù)移位翁涤,即操作符右邊的數(shù)不可以為負(fù)數(shù)桥言,否則會拋出運(yùn)行時異常。

注意:Solidity中葵礼,右移位是和除等價的号阿,因此右移位一個負(fù)數(shù),向下取整時會為0章咧,而不像其他語言里為無限負(fù)小數(shù)倦西。

定長浮點(diǎn)型(Fixed Point Numbers)

注意:定長浮點(diǎn)型 Solidity(發(fā)文時)還不完全支持,它可以用來聲明變量赁严,但不可以用來賦值扰柠。

fixed/ufixed: 表示有符號和無符號的固定位浮點(diǎn)數(shù)。關(guān)鍵字為ufixedMxNufixedMxN疼约。
M表示這個類型要占用的位數(shù)卤档,以8步進(jìn),可為8到256位程剥。
N表示小數(shù)點(diǎn)的個數(shù)劝枣,可為0到80之間

支持的運(yùn)算符:

  • 比較運(yùn)算符: <=, < , ==, !=, >=, > (返回布爾值:true 或 false)
  • 算術(shù)操作符:+,-织鲸,一元運(yùn)算-舔腾,一元運(yùn)算+,搂擦,/, %(取余數(shù))
    注意:它和大多數(shù)語言的float和double不一樣稳诚,
    M*是表示整個數(shù)占用的固定位數(shù),包含整數(shù)部分和小數(shù)部分瀑踢。因此用一個小位數(shù)(M較邪饣埂)來表示一個浮點(diǎn)數(shù)時才避,小數(shù)部分會幾乎占用整個空間。

定長字節(jié)數(shù)組(Fixed-size byte arrays)

關(guān)鍵字有:bytes1, bytes2, bytes3, …, bytes32氨距。(以步長1遞增)
byte代表bytes1桑逝。

支持的運(yùn)算符:

  • 比較符: <=, <, ==, !=, >=, > (返回bool)
  • 位操作符: &, |, ^ (按位異或),~(按位取反), << (左移位), >> (右移位)
  • 索引(下標(biāo))訪問: 如果x是bytesI俏让,當(dāng)0 <= k < I 楞遏,則x[k]返回第k個字節(jié)(只讀)。

移位運(yùn)算和整數(shù)類似舆驶,移位運(yùn)算的結(jié)果的正負(fù)取決于操作符左邊的數(shù)橱健,且不能進(jìn)行負(fù)移位。
如可以-5<<1, 不可以5<<-1

成員變量:
.length:表示這個字節(jié)數(shù)組的長度(只讀)沙廉。

變長(動態(tài)分配大小)字節(jié)數(shù)組(Dynamically-sized byte array)

  • bytes:動態(tài)分配大小字節(jié)數(shù)組, 參見Arrays,不是值類型!
  • string:動態(tài)分配大小UTF8編碼的字符類型,參看Arrays臼节。不是值類型!

根據(jù)經(jīng)驗(yàn):
bytes用來存儲任意長度的字節(jié)數(shù)據(jù)撬陵,string用來存儲任意長度的(UTF-8編碼)的字符串?dāng)?shù)據(jù)。
如果長度可以確定网缝,盡量使用定長的如byte1到byte32中的一個巨税,因?yàn)檫@樣更省空間。

有理數(shù)和整型常量(Rational and Integer Literals)

也有人把Literals翻譯為字面量

整型常量是有一系列0-9的數(shù)字組成粉臊,10進(jìn)制表示草添,比如:8進(jìn)制是不存在的,前置0在Solidity中是無效的扼仲。

10進(jìn)制小數(shù)常量(Decimal fraction literals)帶了一個.远寸, 在.的兩邊至少有一個數(shù)字,有效的表示如:1., .11.3.

科學(xué)符號也支持屠凶,基數(shù)可以是小數(shù)驰后,指數(shù)必須是整數(shù), 有效的表示如: 2e10, -2e10, 2e-10, 2.5e1矗愧。

數(shù)字常量表達(dá)式本身支持任意精度灶芝,也就是可以不會運(yùn)算溢出,或除法截斷唉韭。但當(dāng)它被轉(zhuǎn)換成對應(yīng)的非常量類型夜涕,或者將他們與非常量進(jìn)行運(yùn)算,則不能保證精度了属愤。
如:(2800 + 1) - 2800的結(jié)果為1(uint8整類) 女器,盡管中間結(jié)果已經(jīng)超過計(jì)算機(jī)字長。另外:.5 * 8的結(jié)果是4春塌,盡管有非整形參與了運(yùn)算晓避。

只要操作數(shù)是整形簇捍,整型支持的運(yùn)算符都適用于整型常量表達(dá)式。
如果兩個操作數(shù)是小數(shù)俏拱,則不允許進(jìn)行位運(yùn)算暑塑,指數(shù)也不能是小數(shù)。

注意:
Solidity對每一個有理數(shù)都有一個數(shù)值常量類型锅必。整數(shù)常量和有理數(shù)常量從屬于數(shù)字常量事格。所有的數(shù)字常表達(dá)式的結(jié)果都屬于數(shù)字常量。所以1 + 2和2 + 1都屬于同樣的有理數(shù)的數(shù)字常量3

警告:
整數(shù)常量除法搞隐,在早期的版本中是被截斷的驹愚,但現(xiàn)在可以被轉(zhuǎn)為有理數(shù)了,如5/2的值為 2.5

注意:
數(shù)字常量表達(dá)式劣纲,一旦其中含有常量表達(dá)式逢捺,它就會被轉(zhuǎn)為一個非常量類型。下面代碼中表達(dá)式的結(jié)果將會被認(rèn)為是一個有理數(shù):

uint128 a = 1;
uint128 b = 2.5 + a + 0.5;

上述代碼編譯不能通過癞季,因?yàn)閎會被編譯器認(rèn)為是小數(shù)型劫瞳。

字符串常量

字符串常量是指由單引號,或雙引號引起來的字符串 (“foo” or ‘bar’)绷柒。字符串并不像C語言志于,包含結(jié)束符,”foo”這個字符串大小僅為三個字節(jié)废睦。和整數(shù)常量一樣伺绽,字符串的長度類型可以是變長的。字符串可以隱式的轉(zhuǎn)換為byte1,…byte32 如果適合嗜湃,也會轉(zhuǎn)為bytes或string奈应。

字符串常量支持轉(zhuǎn)義字符,比如\n净蚤,\xNN钥组,\uNNNN。其中\(zhòng)xNN表示16進(jìn)制值今瀑,最終轉(zhuǎn)換合適的字節(jié)程梦。而\uNNNN表示Unicode編碼值,最終會轉(zhuǎn)換為UTF8的序列橘荠。

十六進(jìn)制常量(Hexadecimal literals)

十六進(jìn)制常量屿附,以關(guān)鍵字hex打頭,后面緊跟用單或雙引號包裹的字符串哥童,內(nèi)容是十六進(jìn)制字符串挺份,如hex”001122ff”。
它的值會用二進(jìn)制來表示贮懈。

十六進(jìn)制常量和字符串常量類似匀泊,也可以轉(zhuǎn)換為字節(jié)數(shù)組优训。

枚舉(Enums)

在Solidity中,枚舉可以用來自定義類型各聘。它可以顯示的轉(zhuǎn)換與整數(shù)進(jìn)行轉(zhuǎn)換揣非,但不能進(jìn)行隱式轉(zhuǎn)換。顯示的轉(zhuǎn)換會在運(yùn)行時檢查數(shù)值范圍躲因,如果不匹配早敬,將會引起異常。枚舉類型應(yīng)至少有一名成員大脉。下面是一個枚舉的例子:

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);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搞监,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子镰矿,更是在濱河造成了極大的恐慌琐驴,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秤标,死亡現(xiàn)場離奇詭異棍矛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抛杨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荐类,“玉大人怖现,你說我怎么就攤上這事∮窆蓿” “怎么了屈嗤?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吊输。 經(jīng)常有香客問我饶号,道長,這世上最難降的妖魔是什么季蚂? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任茫船,我火速辦了婚禮,結(jié)果婚禮上扭屁,老公的妹妹穿的比我還像新娘算谈。我一直安慰自己,他們只是感情好料滥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布然眼。 她就那樣靜靜地躺著,像睡著了一般葵腹。 火紅的嫁衣襯著肌膚如雪高每。 梳的紋絲不亂的頭發(fā)上屿岂,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音鲸匿,去河邊找鬼爷怀。 笑死,一個胖子當(dāng)著我的面吹牛晒骇,可吹牛的內(nèi)容都是我干的霉撵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洪囤,長吁一口氣:“原來是場噩夢啊……” “哼徒坡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘤缩,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤喇完,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剥啤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锦溪,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年府怯,在試婚紗的時候發(fā)現(xiàn)自己被綠了刻诊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡牺丙,死狀恐怖则涯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冲簿,我是刑警寧澤粟判,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站峦剔,受9級特大地震影響档礁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吝沫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一呻澜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧野舶,春花似錦易迹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春窘疮,著一層夾襖步出監(jiān)牢的瞬間袋哼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工闸衫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涛贯,地道東北人篙螟。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓众旗,卻偏偏與公主長得像谈秫,于是被迫代替她去往敵國和親爬舰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容