目录
第一题
第二题
第三题
第四题
第五题
第六题
第一题
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.6.0;
contract math {
//1.根据所属类型值域,修改变量numa与numb值
uint8 numa = 256;
int8 numb = 128;
int numc = 255;function square(uint a , uint b) public pure returns(uint){
//2.请你补充代码,使得返回的值为输入参数a的b次方。}
答案
通过公式推导无符号整型取值范围:[0 , (2的位次方)-1]
无符号整型8位的取值范围是 [0 , 255 ]
通过公式推导整型取值范围: [ -2的位次方-1 , ( 2的位次方-1)-1]
整型8位的取值范围是[-128 , 127]
如果不写多少位,那么默认为256位
1.对应的值设置范围内即可
2.运用幂运算符 a**b;
第二题
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Math{
uint8 a = 3;
uint8 b = 4;
// LogicAnd函数返回的值是? (1)
function LogicAnd() public view returns(uint8){
return a&b;
}
//LogicOr函数返回的值是? (2)
function LogicOr() public view returns(uint8){
return a|b;
}
//reverse函数返回的值是? (3)
function reverse() public view returns(uint8){
return ~a;
}
//xor函数返回的值是? (4)
function xor() public view returns(uint8){
return a^b;
}
//leftShift函数返回的值是? (5)
function leftShift() public view returns(uint8){
return a<<1;
}
//rightShift函数返回的值是? (6)
function rightShift() public view returns(uint8){
return a>>1;
}
}
第三题
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.6.0;
contract demo{
//1.函数add将会返回什么值? (1)
function add() public pure returns (uint8 _overflow) {
uint8 max = 256 - 1;
return max + 1;
}
//2.函数sub将会返回什么值? (2)
function sub() public pure returns (uint8 _underflow) {
uint8 min = 0;
return min - 1;
}
//3.函数mul将会返回什么值? (3)
function mul_overflow() public pure returns (uint8 _overflow) {
uint8 mul = 128;
return mul*2 ;
}
}//4.请查阅资料,理解整型溢出的原理。思考是否有防范整型溢出的方法并对上面的代码进行防溢出的优化。
答案
1.根据溢出原理,这是向上溢出,那么溢出后值会变成最小值,返回0
2.根据溢出原理,这是向下溢出,那么溢出后值会变成最大值,返回255
3.根据溢出原理,这是向上溢出,那么溢出后值会变成最小值,返回0
4.可以通过SafeMath库来解决溢出问题,详细请看(14条消息) Solidity拓展:数学运算过程中数据长度溢出的问题_尽-欢的博客-CSDN博客
第四题
//实验1
// SPDX-License-Identifier: GPL-3.0
pragma solidity^0.8.0;
contract helloworld{
//1.哪些函数将编译失败? (函数1,函数2,还是函数3?)
function intergerTest1() public view returns(uint){
uint num = 2/4;
return num ;
}
function intergerTest2() public view returns(uint){
uint num = 2/4*10000;
return num ;
}
function intergerTest3() public view returns(uint){
uint num = 2/6*10000;
return num ;
}
}
//实验2
/*2.现在如果你的电脑有其他编程语言比如java,请打开编辑器并用实验2中的方法定义3个
整数类型,比较java语言和solidity语言之间结果的不同*/
uint num1 = (2*800+1)-2*800;
uint num2 = 2/4*10000;
uint num3 = 2/4;
答案
1.函数1和函数3将编译失败,因为计算的结果为小数,不能赋值给无符号整型变量,应为ufixed(无符号浮点)
2.java在数字运算中如果结果出现小数那么采取取整机制,而在solidity中int和uint出现了小数它不会采取取整机制,而是立马报错
第五题
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract ByteArray{//1.根据赋值的数值长度为变量num1,num2,num3声明正确的固定长度字节类型。
bytes1 public num1 = 0x7a; //0111 1010
bytes2 public num2 = 0x7a68; //0111 1010 0110 1000
bytes12 public num3 = 0x7a68656e676a69616e78756e; //96位//2.以下三个函数的返回值为
function getLength() public view returns(uint){
return num1.length;
}
function getLength2() public view returns(uint){
return num2.length;
}
function getLength3() public view returns(uint){
return num3.length;
}
function setLength() public {
num1.length = 18; // 3.判断字节数组长度是否能改变? (是或否)
}
}
答案
1.没有错误,不需要修改
2.第一个函数为1,第二个函数为2,第三个函数为12
3.不能,定长数组长度不能改变
第六题
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract DynamicByte{
bytes public name = new bytes(2);
function Initname ()public{
name[0] = 0x7a;
name[1] = 0x68;
}
function getLength() public view returns(uint) {
return name.length;
}//1.补充changename函数代码,将name字节索引0处的字符改为0x88。
function changename()public{
}/*2.补充pushBytes函数代码,使用push关键字对动态字节name追加一个字节,思考追加字符在字节中的位置。(如:0x99)*/
function pushBytes()public{
}//3.补充bytesToString函数功能,将bytes类型的name转换为string类型并返回。
function bytesToString()public view returns(string memory){
}
}
答案
1.ascll码0x88转化为16进制转换为十进制为136,但是只能到126编译出错,因此不能改为0x88可以改为0x33 name[0] = 0x33;
2.name.push(0x99); 追加的位置为末尾
3.string(name);