반응형
https://tact-by-example.org/02-integer-ops
정수 연산
Tact는 정수를 사용한 모든 런타임 계산을 257 비트에서 수행한다. 이 비트의 크기는 큰 수를 다룰 수 있지만, 수학 연산의 결과가 너무 커서 맞지 않으면 오버플로우가 발생할 수 있다. 하지만, 결과가 이 범위를 벗어나게 되면 시스템은 예외를 발생시키고 트랜잭션을 실패시킨다. 이것이 Tact가 안전한 수학 연산을 보장하는 방식이다.
또한, Tact는 서로 다른 크기의 변수를 혼합하여 사용해도 문제가 없도록 설계되었다. 모든 변수는 런타임 시 동일한 유형으로 처리되며, 이는 항상 부호가 있는 257 정수이다. 예를 들어, 달러를 사용한 산술에는 소수점 이하 두 자리가 필요하다. 하지만, 달러를 다룰 때에는 소수점 이하 두 자리가 필요하므로 달러를 정수로만 다룰 수는 없다. 대신에 센트 단위로 작업한다. 이처럼 Ton 코인을 다룰 때는 9 decimal을 사용한다. 즉, ton(”1.25”) = 1250000000 이다.
import "@stdlib/deploy";
contract Integers with Deployable {
// contract persistent state variables
i1: Int as uint128 = 3001;
i2: Int as int32 = 57;
init() {}
receive("show ops") {
let i: Int = -12; // temporary variable, runtime Int type is always int257 (range -2^256 to 2^256 - 1)
dump(i);
i = self.i1 * 3 + (self.i2 - i); // basic math expressions
dump(i);
i = self.i1 % 10; // modulo (remainder after division), 3001 % 10 = 1
dump(i);
i = self.i1 / 1000; // integer division (truncation toward zero), 3001 / 1000 = 3
dump(i);
i = self.i1 >> 3; // shift right (divide by 2^n)
dump(i);
i = self.i1 << 2; // shift left (multiply by 2^n)
dump(i);
i = min(self.i2, 11); // minimum between two numbers
dump(i);
i = max(self.i2, 66); // maximum between two numbers
dump(i);
i = abs(-1 * self.i2); // absolute value
dump(i);
dump(self.i1 == 3001);
dump(self.i1 > 2000);
dump(self.i1 >= 3002);
dump(self.i1 != 70);
}
}
위 예시처럼 tact 에서는 dump() 를 사용해 디버깅이 가능한데, show ops 함수를 호출해보면 아래와 같은 결과를 확인할 수 있다.
> 📤 Sending message show ops:
Message sent: "show ops", from deployer, to contract, value 1, not bounced
#DEBUG#: -12 // i 의 값에 -12 를 넣어주었기에, -12가 출력
#DEBUG#: 9072 // i1 = 3001, i2 = 57, i = -12, (3001 * 3) + (57 - (-12))
#DEBUG#: 1 // i1 을 10으로 나눴을 때 나머지, 3001 % 10
#DEBUG#: 3 // i1 을 10으로 나눴을 때 몫, 3001 / 10
#DEBUG#: 375 // 101110111001 을 오른쪽으로 세 칸 shift, 2^3 으로 나눈 결과와 동일
#DEBUG#: 12004 // 101110111001 을 왼쪽으로 두 칸 shift, 2^2 을 곱한 결과와 동일
#DEBUG#: 11 // 57, 11 중에 더 작은 수는?
#DEBUG#: 66 // 57, 66 중에 더 큰 수는?
#DEBUG#: 57 // -57 의 절대값
#DEBUG#: true // i1 =3001 일 때 i1이 3001 가 동일한가?
#DEBUG#: true // i1 이 2000 보다 큰가?
#DEBUG#: false // i1 이 3002 보다 큰가?
#DEBUG#: true // i1 이 70가 동일하지 않은가?
Transaction Executed: success, Exit Code: 0, Gas: 0.023786
반응형
'블록체인 > TACT' 카테고리의 다른 글
[Tact] Addresses (0) | 2024.05.17 |
---|---|
[Tact] Bools (0) | 2024.05.15 |
[Tact] Integers (0) | 2024.05.15 |
[Tact] Simple 카운터 (0) | 2024.05.07 |
[Tact] getter 함수 (0) | 2024.05.07 |
댓글