본문 바로가기
블록체인/TACT

[Tact] Integer Opertaions

by 제이제이_은재 2024. 5. 15.
반응형

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

댓글