スマート コントラクトを一緒に書くための堅牢性を学ぶ - 整数 (uint と int)

序文

一般的には整数の方が多く使われ、整数の存在は様々なコントラクトに見られるようになるので、この型も学習の道では欠かせません。

周囲:

リミックス コンパイラがクリックしてジャンプ

文章

sol では多くの種類の整数データに遭遇するため、sol は整数の 2 つのデータ型を提供します。

符号付き整数 (int) : ここでは、正と負の整数として理解できます

符号なし整数 (uint) : 正の数と 0 のみが存在する符号なし整数

より良いメモリ制御を行うために、sol は int8、int16、int32 など、int256 までの符号なし整数型を提供します。

同じことが符号なし整数 uint8、uint16、uint32...uint256 にも当てはまります。

選択で注意する必要があるのは、データの 0 ~ 256 ビットの場合、uint8 を使用してから、int8 を使用して符号付きの負の数を正の数 -128 ~ 127 に格納できるということです。実際の状況によると、上がります。

この 8、16、32...256 は何を意味するのでしょうか?

これが私たちの 2 進数です。私たちのコンピューターは 0101 コードで構成されているため、基礎となるストレージ ロジックは 2 進数です。ここで 00000000 は 2 進数で 0 を表し、11111111 は 2 進数で 256 を表します。注意深い生徒はこの数字を見つけます。数字は 8 です。それだけです。私たちのストレージはこのように保存されています

int と演算子

整数型でサポートされている演算子には、比較演算子、ビット演算子、および算術演算子の 3 種類があります。

比較演算子

<= (以下) < (未満) == (等しい) != (等しくない) >= (以上) > (より大きい)

ビット演算子

&&(と) || (または) ^ (排他的または) ~ (ビット反転)

算術演算子

+ - 単項演算子「-」 単項演算子「+」 * / % ** << >>

改めて見てみると、左右シフトの動作に問題があると推測されます。

左シフト: a << b は、a の 2 倍の b 乗として理解できます。

右シフト: a >> b は、a を 2 で割った b 乗として理解できます。

演算子は次のように使用されます。

uint256 public _uintNum = 12345; //整数の結果: 12345

uint256 public _uintNum1 = _uintNum + 1; //加算結果: 12346

uint256 public _uintNum2 = 2**2; // 指数の結果: 4

uint256 public _uintNum3 = 7 % 2; //残りの結果: 1

bool public _boolnum = _ uintNum2 > _uintNum3;//判定結果: true

予防

申告方法

int8 a = -1;

uint16 b = 1;

uint c ;

int d ;

整数演算では、定数が検出されると、切り捨てられます。定数の場合は、切り捨てられません。定数は、定義時に値を持ち、変更されない量です。0 に遭遇すると、それは次のようになります。違法であり、エラーが報告されます。

左右の変位は 2 進数の位置を移動することです. これで 10000 のような 2 進数が得られました. これは 10 進数で 32 です. 次に右に 1000 に移動します. 左シフトについても同じことが言えます.

ネガティブに考えられない、ネガティブになれない

負の数は累乗できません。つまり、"**" です。

pragma solidity ^0.4.23; //表示编译器的版本,^代表大版本为4即可
contract UintTest{ //创建一个合约 自定义合约名为UintTest
uint a = 10; // 定义一个变量a为10
uint b = 2; // 定义一个变量b为2
function getUint() public view returns(uint){// 定义一个函数 函数名为getUint 权限为公共 只读 返回一个uint类型 
uint sum = a ** b + 3 % 2;// 定义一个uint类型使用运算符a的b次方加3取余2最后的结果为101
return sum;// 返回sum
}
}

 

おすすめ

転載: blog.csdn.net/qq_57309855/article/details/127349858