부호 있는 정수: 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 (vsuint80 ~ 255)int256: 약 -5.7 × 10^76 ~ 약 5.7 × 10^76
같은 8비트라도 uint8 은 0255 를, 127 을 담습니다. 양수 쪽만 보면 int8 은 -128uint8 의
범위가 두 배 넓은 셈입니다. 양수만 다룬다면 범위가 더 넓은 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 됩니다. 경계값 연산에 주의하세요.