int/uint:
变长的有符号或无符号整型。变量支持的步长以8
递增,支持从uint8
到uint256
,以及int8
到int256
。需要注意的是,uint
和int
默认代表的是uint256
和int256
。
什么是有符号整型,什么是无符号整型
无符号整型(uint)是计算机编程中的一种数值资料型别。有符号整型(int)可以表示任何规定范围内的整数,无符号整型只能表示非负数(0及正数)。
有符号整型能够表示负数的代价是其能够存储正数的范围的缩小,因为其约一半的数值范围要用来表示负数。如:uint8
的存储范围为0 ~ 255
,而int8
的范围为-127 ~ 127
如果用二进制表示:
-
uint8: 0b
00000000
~ 0b11111111
,每一位都存储值,范围为0 ~ 255 -
int8:0b
11111111
~ ob01111111
,最左一位表示符号,1
表示负
,0
表示正
,范围为-127 ~ 127
支持的运算符
比较:
<=
,<
,==
,!=
,>=
,>
,返回值为bool
类型。位运算符:
&
,|
,(^
异或),(~
非)。数学运算:
+
,-
,一元运算+
,*
,/
,(%
求余),(**
次方),(<<
左移),(>>
右移)。
Solidity目前沒有支持double/float
,如果是 7/2
会得到3
,即无条件舍去。但如果运算符是字面量,则不会截断(后面会进一步提到)。另外除0会抛异常 ,我们来看看下面的这个例子:
同其它语言一样,整数的除法运算总是会被截断,如果是 7/2
会得到3
,即无条件舍去。
但使用字面量(我的理解其实就是常量)的方式,var e = 1 / 4
的情况,则不会截断。但由于测试时使用最新0.4.22版本,语言还没有实现定点小数,故下面的这个例子会报错。
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;//未截断
//UnimplementedFeatureError: Not yet implemented - FixedPointType.
return d;
}
}
移位
左移位x<<y
相当于执行x * 2**y
,右移位x >> y
相当于执行x / 2**y
。意味着对一个负数移位会保留符号。
pragma solidity ^0.4.0;
contract IntegerTest{
function shift() returns (int, int, int, int){
var a = -1 << 2;//-4
var b = -1 >> 2;//0 (这里由于截断机制,所以不是负小数,而是0)
var c = 1 << 2;//4
var d = 1 >> 2;//0
return (a, b, c, d);
}
}
异常
除以零或对零取模,对一个值移负数位会抛出运行时异常。
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
}
}
整数字面量
整数字面量,由包含0-9的数字序列组成,默认被解释成十进制。在Solidity
中不支持八进制,前导0
会被默认忽略,如0100
,会被认为是100
。
小数由.
组成,在他的左边或右边至少要包含一个数字。如1.
,.1
,1.3
均是有效的小数。
字面量本身支持任意精度,也就是可以不会运算溢出,或除法截断。但当它被转换成对应的非字面量类型,如整数或小数。或者将他们与非字面量进行运算,则不能保证精度了。
pragma solidity ^0.4.0;
contract IntegerLiteral{
function integerTest() returns (uint, uint, uint){
//超出运算字长了
var i = (2**800 + 1) - 2**800;
var j = 1/3*3;
//小数运算
var k = 0.5*8;
return (i, j,k);
}
}