블록체인 학습
0 XP

부호 있는 정수: int

앞 수업의 uint 은 0 이상만 담을 수 있었습니다. 하지만 온도, 손익(profit/loss), 좌표처럼 음수가 의미 있는 값도 있습니다. 이럴 때 사용하는 타입이 int, 곧 부호 있는 정수(signed integer) 입니다. int 은 음수와 양수를 모두 저장할 수 있습니다.

int 역시 int256 의 별칭이고, 초기화하지 않은 int 변수의 기본값은 0 입니다.

uint 과의 범위 차이

int 은 맨 앞 1비트를 부호 비트(sign bit) 로 사용합니다. 그래서 같은 비트 수라도 양수 쪽 표현 범위가 uint 의 절반으로 줄어듭니다. 내부적으로는 음수를 2의 보수(two's complement)로 표현합니다.

  • int8 : -128 ~ 127 (vs uint8 0 ~ 255)
  • int256 : 약 -5.7 × 10^76 ~ 약 5.7 × 10^76

같은 8비트라도 uint8 은 0255 를, int8 은 -128127 을 담습니다. 양수 쪽만 보면 uint8 의 범위가 두 배 넓은 셈입니다. 양수만 다룬다면 범위가 더 넓은 uint 을 쓰는 편이 좋습니다.

언제 int 을 쓰나

"이 값이 0보다 작아질 수 있는가?"를 먼저 자문하세요. 잔액·개수처럼 절대 음수가 될 수 없다면 uint 이 더 안전하고 의미가 명확합니다. 반대로 변화량(delta), 기온, 상대 점수처럼 음의 값이 자연스러운 경우에만 int 을 선택합니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract IntExample {
    int256 public temperature = -15;   // 영하 15도
    int8 public smallSigned = -128;    // int8 의 최소값
    int public defaultInt = -1;        // int == int256
 
    function difference(int256 a, int256 b) public pure returns (int256) {
        return a - b; // 결과가 음수일 수 있으므로 int 사용
    }
}

예제 아래쪽의 function difference(...) public pure returns (int256) 은 인자만으로 계산해 값을 돌려주고 저장된 값은 읽지도 쓰지도 않는 함수라는 뜻입니다. 함수 문법은 Chapter 5에서 본격적으로 다루니, 지금은 int 이 쓰이는 자리만 눈에 담아 두세요.

^0.8.0 부터는 int 의 오버플로/언더플로도 자동으로 감지됩니다. 예를 들어 int8 최소값 -128 에서 1을 더 빼면 범위를 벗어나 트랜잭션이 revert 됩니다. 경계값 연산에 주의하세요.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.