Solidity拓展:数据类型的转换

1.数据类型隐式转换 (自动)

同一类型之间的转换:由低长度转换为高长度int8-int16-int32······int256,但int不能自动转换成uint,因为放不下负数所以直接不让转换,且 int8 不能转换成 uint256 (因为 uint256 不能涵盖某些值,例如, -1)。

下面加法的操作数 y 和 z 没有相同的类型,但是 uint8 可以被隐式转换为 uint16,相反却不可以。 因此, 在执行加法之前,将 y 转换为 z 的类型, 在 uint16 类型中。 表达式  y + z 的结果类型是 uint16 。 在执行加法之后。 因为它被赋值给 uint32 类型的变量,又进行了另一个隐式转换.

uint8 y;
uint16 z;
uint32 x = y + z;

2.数据类型显示转换(强制)        

如果某些情况下编译器不支持隐式转换,但是你很清楚你要做什么,这种情况可以考虑显式转换。 注意这可能会发生一些无法预料的后果,因此一定要进行测试,确保结果是你想要的!

1.将一个 int8 类型的负数转换成 uint

int8 y = -3;
uint x = uint(y);

这段代码的最后,x 的值将是 0xfffff..fd (64 个 16 进制字符),因为这是 -3 的 256 位补码形式。

2.如果一个类型显式转换成更小的类型,相应的高位将被舍弃

uint32 a = 0x12345678;
uint16 b = uint16(a); // 此时 b 的值是 0x5678

3.如果将整数显式转换为更大的类型,则将填充左侧(即在更高阶的位置)。 转换结果依旧等于原来整数

uint16 a = 0x1234;
uint32 b = uint32(a); // b 为 0x00001234 now
assert(a == b);

定长字节数组转换则有所不同, 他们可以被认为是单个字节的序列和转换为较小的类型将切断序列

bytes2 a = 0x1234;
bytes1 b = bytes1(a); // b 为 0x12

1.如果将定长字节数组显式转换为更大的类型,将按正确的方式填充。 以固定索引访问转换后的字节将在和之前的值相等 (如果索引仍然在范围内):

bytes2 a = 0x1234;
bytes4 b = bytes4(a); // b 为 0x12340000
assert(a[0] == b[0]);
assert(a[1] == b[1]);

因为整数和定长字节数组在截断(或填充)时行为是不同的, 如果整数和定长字节数组有相同的大小,则允许他们之间进行显式转换, 如果要在不同的大小的整数和定长字节数组之间进行转换 ,必须使用一个中间类型来明确进行所需截断和填充的规则:
bytes2 a = 0x1234;
uint32 b = uint16(a); // b 为 0x00001234
uint32 c = uint32(bytes4(a)); // c 为 0x12340000
uint8 d = uint8(uint16(a)); // d 为 0x34
uint8 e = uint8(bytes1(a)); // e 为 0x12

3.字面常量与基本类型的转换

整型与字面常量转换

十进制和十六进制字面常量可以隐式转换为任何足以表示它而不会截断的整数类型

uint8 a = 12; //  可行
uint32 b = 1234; // 可行
uint16 c = 0x123456; // 失败, 会截断为 0x3456

定长字节数组与字面常量转换

十进制字面常量不能隐式转换为定长字节数组。十六进制字面常量可以是,但仅当十六进制数字大小完全符合定长字节数组长度。 不过零值例外,零的十进制和十六进制字面常量都可以转换为任何定长字节数组类型:

bytes2 a = 54321; // 不可行
bytes2 b = 0x12; // 不可行
bytes2 c = 0x123; // 不可行
bytes2 d = 0x1234; // 可行
bytes2 e = 0x0012; // 可行
bytes4 f = 0; // 可行
bytes4 g = 0x0; // 可行

字符串字面常量和十六进制字符串字面常量可以隐式转换为定长字节数组,如果它们的字符数与字节类型的大小相匹配:

bytes2 a = hex"1234"; // 可行
bytes2 b = "xy"; // 可行
bytes2 c = hex"12"; // 不可行
bytes2 d = hex"123"; // n不可行
bytes2 e = "x"; // 不可行
bytes2 f = "xyz"; // 不可行

4.有关地址类型的数据转换

  • 通过校验和测试的正确大小的十六进制字面常量会作为 address 类型。 
  • 只有 bytes20 和 uint160 允许显式转换为 address 类型 
  • 从 bytes20 或其他整型显示转换为 address 类型时,都会作为 address payable 类型。 
  • 一个地址 address a 可以通过 payable(a) 转换为 address payable 类型.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Solidity 数据类型转换是指将一个数据类型转换为另一个数据类型的过程。在 Solidity 中,可以使用强制类型转换或隐式类型转换来实现数据类型转换。强制类型转换需要使用类型转换运算符,例如将 uint256 类型转换为 uint8 类型可以使用 uint8(uint256)。隐式类型转换则是在表达式中自动进行的,例如将 uint8 类型和 uint256 类型相加,Solidity 会自动将 uint8 类型转换为 uint256 类型。 ### 回答2: Solidity是一种面向合约开发的编程语言,支持多种数据类型数据类型转换是在Solidity中常见的操作之一。 在Solidity中,数据类型转换可以通过显式或隐式的方式来完成。显式转换是通过使用强制类型转换操作符进行的,例如:`(uint8) x`将数据`x`转换为uint8类型。显式转换可以确保数据类型之间的兼容性,但需要开发者明确地指定要转换的目标类型。 隐式转换是在需要的时候自动进行的,无需显式的类型转换操作。例如,当一个uint8类型的变量与一个uint256类型的变量进行运算时,Solidity会自动将uint8类型转换为uint256类型,以便进行计算。这种隐式转换可简化代码,但也需要开发者了解Solidity的类型转换规则,以确保转换结果的正确性。 在Solidity中,还存在一些特殊的数据类型转换操作。例如,`address payable`类型可以通过`address(uint160(address))`进行转换,从而实现从普通地址类型到可支付地址类型的转换。类似地,`bytes32`类型可以通过`bytes32(uint256(x))`进行转换,将一个uint256类型的变量转换为bytes32类型。 需要注意的是,数据类型转换可能会导致数据精度丢失或溢出。开发者应该小心使用类型转换,并确保转换操作不会引起意外的结果。 总而言之,Solidity支持显式和隐式的数据类型转换开发者可以根据需要选择合适的转换方式。类型转换Solidity中重要的操作之一,但在使用时需要注意数据兼容性、精度问题和结果正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值