int/uint:
變長(zhǎng)的有符號(hào)或無(wú)符號(hào)整型褐奥。變量支持的步長(zhǎng)以8
遞增仰挣,支持從uint8
到uint256
,以及int8
到int256
伸蚯。需要注意的是摩渺,uint
和int
默認(rèn)代表的是uint256
和int256
。
什么是有符號(hào)整型剂邮,什么是無(wú)符號(hào)整型
無(wú)符號(hào)整型(uint)是計(jì)算機(jī)編程中的一種數(shù)值資料型別摇幻。有符號(hào)整型(int)可以表示任何規(guī)定范圍內(nèi)的整數(shù),無(wú)符號(hào)整型只能表示非負(fù)數(shù)(0及正數(shù))挥萌。
有符號(hào)整型能夠表示負(fù)數(shù)的代價(jià)是其能夠存儲(chǔ)正數(shù)的范圍的縮小绰姻,因?yàn)槠浼s一半的數(shù)值范圍要用來(lái)表示負(fù)數(shù)。如:uint8
的存儲(chǔ)范圍為0 ~ 255
引瀑,而int8
的范圍為-127 ~ 127
如果用二進(jìn)制表示:
-
uint8: 0b
00000000
~ 0b11111111
狂芋,每一位都存儲(chǔ)值,范圍為0 ~ 255 -
int8:0b
11111111
~ ob01111111
憨栽,最左一位表示符號(hào)帜矾,1
表示負(fù)
,0
表示正
屑柔,范圍為-127 ~ 127
支持的運(yùn)算符
比較:
<=
屡萤,<
,==
掸宛,!=
灭衷,>=
,>
旁涤,返回值為bool
類(lèi)型翔曲。位運(yùn)算符:
&
迫像,|
,(^
異或)瞳遍,(~
非)闻妓。數(shù)學(xué)運(yùn)算:
+
,-
掠械,一元運(yùn)算+
由缆,*
,/
猾蒂,(%
求余)均唉,(**
次方),(<<
左移)肚菠,(>>
右移)舔箭。
Solidity目前沒(méi)有支持double/float
,如果是 7/2
會(huì)得到3
蚊逢,即無(wú)條件舍去层扶。但如果運(yùn)算符是字面量,則不會(huì)截?cái)?后面會(huì)進(jìn)一步提到)烙荷。另外除0會(huì)拋異常 镜会,我們來(lái)看看下面的這個(gè)例子:
同其它語(yǔ)言一樣,整數(shù)的除法運(yùn)算總是會(huì)被截?cái)?如果是 7/2
會(huì)得到3
终抽,即無(wú)條件舍去戳表。
但使用字面量(我的理解其實(shí)就是常量)的方式,var e = 1 / 4
的情況昼伴,則不會(huì)截?cái)喟切洹5捎跍y(cè)試時(shí)使用最新0.4.22版本,語(yǔ)言還沒(méi)有實(shí)現(xiàn)定點(diǎn)小數(shù)亩码,故下面的這個(gè)例子會(huì)報(bào)錯(cuò)季率。
pragma solidity ^0.4.0;
contract IntegerTest{
function get() returns (int){
int a = 1;
int b = 4;
var d = a / b;//0
var e = 1 / 4;//未截?cái)? //UnimplementedFeatureError: Not yet implemented - FixedPointType.
return d;
}
}
移位
左移位x<<y
相當(dāng)于執(zhí)行x * 2**y
,右移位x >> y
相當(dāng)于執(zhí)行x / 2**y
描沟。意味著對(duì)一個(gè)負(fù)數(shù)移位會(huì)保留符號(hào)飒泻。
pragma solidity ^0.4.0;
contract IntegerTest{
function shift() returns (int, int, int, int){
var a = -1 << 2;//-4
var b = -1 >> 2;//0 (這里由于截?cái)鄼C(jī)制,所以不是負(fù)小數(shù)吏廉,而是0)
var c = 1 << 2;//4
var d = 1 >> 2;//0
return (a, b, c, d);
}
}
異常
除以零或?qū)α闳∧E⒁牛瑢?duì)一個(gè)值移負(fù)數(shù)位會(huì)拋出運(yùn)行時(shí)異常。
pragma solidity ^0.4.0;
contract IntegerTest{
function exp() {
uint a = 1;
uint b = 0;
//var x = a / b;//VM Exception: invalid opcode
int c = -1;
//var y = a >> c;//VM Exception: invalid opcode
}
}
整數(shù)字面量
整數(shù)字面量席覆,由包含0-9的數(shù)字序列組成史辙,默認(rèn)被解釋成十進(jìn)制。在Solidity
中不支持八進(jìn)制,前導(dǎo)0
會(huì)被默認(rèn)忽略聊倔,如0100
晦毙,會(huì)被認(rèn)為是100
。
小數(shù)由.
組成耙蔑,在他的左邊或右邊至少要包含一個(gè)數(shù)字见妒。如1.
,.1
甸陌,1.3
均是有效的小數(shù)须揣。
字面量本身支持任意精度,也就是可以不會(huì)運(yùn)算溢出钱豁,或除法截?cái)喑芸ā5?dāng)它被轉(zhuǎn)換成對(duì)應(yīng)的非字面量類(lèi)型,如整數(shù)或小數(shù)牲尺÷牙遥或者將他們與非字面量進(jìn)行運(yùn)算,則不能保證精度了秸谢。
pragma solidity ^0.4.0;
contract IntegerLiteral{
function integerTest() returns (uint, uint, uint){
//超出運(yùn)算字長(zhǎng)了
var i = (2**800 + 1) - 2**800;
var j = 1/3*3;
//小數(shù)運(yùn)算
var k = 0.5*8;
return (i, j,k);
}
}