The Word 구조

The Word 구조

WORD 시그니처의 인스턴스는 부호 없는 정수 타입과 그 연산을 제공해요.

출처: 문서

본문

시놉시스 (Synopsis)

signature WORD
structure Word :> WORD
where type word = word
structure Word8 :> WORD
structure LargeWord :> WORD
structure Word<N> :> WORD (* OPTIONAL *)
structure SysWord :> WORD (* OPTIONAL *)

인터페이스 (Interface)

eqtype word
val wordSize : int
val toLarge : word -> LargeWord.word
val toLargeX : word -> LargeWord.word
val toLargeWord : word -> LargeWord.word
val toLargeWordX : word -> LargeWord.word
val fromLarge : LargeWord.word -> word
val fromLargeWord : LargeWord.word -> word
val toLargeInt : word -> LargeInt.int
val toLargeIntX : word -> LargeInt.int
val fromLargeInt : LargeInt.int -> word
val toInt : word -> int
val toIntX : word -> int
val fromInt : int -> word
val andb : word * word -> word
val orb : word * word -> word
val xorb : word * word -> word
val notb : word -> word
val << : word * Word.word -> word
val >> : word * Word.word -> word
val ~>> : word * Word.word -> word
val + : word * word -> word
val - : word * word -> word
val * : word * word -> word
val div : word * word -> word
val mod : word * word -> word
val compare : word * word -> order
val < : word * word -> bool
val <= : word * word -> bool
val > : word * word -> bool
val >= : word * word -> bool
val ~ : word -> word
val min : word * word -> word
val max : word * word -> word
val fmt : StringCvt.radix -> word -> string
val toString : word -> string
val scan : StringCvt.radix
-> (char, 'a) StringCvt.reader
-> (word, 'a) StringCvt.reader
val fromString : string -> word option

설명 (Description)

val wordSize : int

toInt·fromInt, toLarge·fromLarge는 정수·워드 변환을 해요.

toLarge w

+·-·*·div·mod 산술 연산을 제공해요.

toLargeX w

>>·<<·orb·xorb·andb·notb 비트 연산을 제공해요.

fromLarge w

fmt·scan·fromString·toString은 워드를 문자열로 변환해요.

fromLargeWord w

이 함수들은 w를 타입 word의 값 w (mod (2(wordSize)))로 변환해요. 이는 w의 2의 보수 표현에서 하위 wordSize개 비트를 취하는 효과를 가져요. fromLargeWordfromLarge의 구식 동의어예요.

toLargeInt w

toLargeIntX w

이 함수들은 w를 LargeInt.int 타입의 값으로 변환해요. 전자는 w를 범위 [0,2(wordSize)-1]의 정수 값으로 봐요. 후자는 w를 wordSize 정밀도의 2의 보수 부호 정수로 취급해, 범위 [-2(wordSize-1),2(wordSize-1)-1]의 값을 가져요. toLargeInt는 대상 정수 값을 LargeInt.int로 표현할 수 없으면 Overflow를 발생시켜요. LargeInt.int의 정밀도는 항상 최소 wordSize이므로(아래 설명 참조), toLargeIntX는 예외를 발생시키지 않아요.

fromLargeInt i

LargeInt.int 타입의 i를 word 타입의 값으로 변환해요. 이는 i의 2의 보수 표현에서 하위 wordSize개 비트를 취하는 효과를 가져요.

toInt w

toIntX w

이 함수들은 w를 기본 정수 타입의 값으로 변환해요. 전자는 w를 범위 [0,2(wordSize)-1]의 정수 값으로 봐요. 후자는 w를 wordSize 정밀도의 2의 보수 부호 정수로 취급해, 범위 [-2(wordSize-1),2(wordSize-1)-1]의 값을 가져요. 대상 정수 값을 Int.int로 표현할 수 없으면 Overflow를 발생시켜요.

fromInt i

기본 정수 타입의 i를 word 타입의 값으로 변환해요. 이는 i의 2의 보수 표현에서 하위 wordSize개 비트를 취하는 효과를 가져요. Int.int의 정밀도가 wordSize보다 작으면 i는 wordSize 비트로 부호 확장돼요.

val andb : word * word -> word
val orb : word * word -> word
val xorb : word * word -> word

이 함수들은 인자의 비트별 AND, OR, 배타적 OR를 각각 돌려줘요.

notb i

i의 비트별 보수(NOT)를 돌려줘요.

<< (i, n)

i를 n 비트 위치만큼 왼쪽으로 시프트하고 오른쪽은 0으로 채워요. i와 n을 부호 없는 이진수로 해석하면 (i* 2(n))(mod (2 (wordSize)))를 돌려줘요. 특히 wordSize 이상만큼 시프트하면 0이 돼요. 이 연산은 많은 프로세서의 '(논리적) 왼쪽 시프트' 명령과 비슷해요.

>> (i, n)

i를 n 비트 위치만큼 오른쪽으로 시프트하고 왼쪽은 0으로 채워요. i와 n을 부호 없는 이진수로 해석하면 floor((i / 2(n)))를 돌려줘요. 특히 wordSize 이상만큼 시프트하면 0이 돼요. 이 연산은 많은 프로세서의 '논리적 오른쪽 시프트' 명령과 비슷해요.

~>> (i, n)

i를 n 비트 위치만큼 오른쪽으로 시프트해요. i의 맨 왼쪽 비트 값은 그대로 유지되는데, 2의 보수 해석에서 이는 부호 확장에 해당해요. i를 wordSize 비트 2의 보수 정수로, n을 부호 없는 이진수로 해석하면 floor((i / 2(n)))를 돌려줘요. 특히 wordSize 이상만큼 시프트하면 0이거나 전부 1이 돼요. 이 연산은 많은 프로세서의 '산술적 오른쪽 시프트' 명령과 비슷해요.

i + j

i와 j를 부호 없는 이진수로 해석할 때 (i+j)(mod (2 (wordSize)))를 돌려줘요. Overflow를 발생시키지 않아요.

i - j

i와 j를 부호 없는 이진수로 해석할 때 i와 j의 차를 modulo (2(wordSize))로 돌려줘요: (2(wordSize) + i - j)(mod (2(wordSize))). Overflow를 발생시키지 않아요.

i * j

i와 j를 부호 없는 이진수로 해석할 때 곱 (i*j)(mod (2(wordSize)))를 돌려줘요. Overflow를 발생시키지 않아요.

i div j

i와 j를 부호 없는 이진수로 해석할 때 i와 j의 잘린 몫 floor((i / j))를 돌려줘요. j = 0이면 Div를 발생시켜요.

i mod j

i와 j를 부호 없는 이진수로 해석할 때 i를 j로 나눈 나머지 i - j * floor((i / j))를 돌려줘요. j = 0이면 Div를 발생시켜요.

compare (i, j)

i와 j를 부호 없는 이진수로 볼 때 i가 j보다 작으면 LESS, 같으면 EQUAL, 크면 GREATER를 돌려줘요.

val < : word * word -> bool
val <= : word * word -> bool
val > : word * word -> bool
val >= : word * word -> bool

입력 인자들을 부호 없는 이진수로 해석할 때 주어진 관계가 성립하면 true를 돌려줘요.

~ i

i의 2의 보수를 돌려줘요.

val min : word * word -> word
val max : word * word -> word

인자 중 더 작은(각각 더 큰) 값을 돌려줘요.

fmt radix i

toString i

이 함수들은 i의 숫자 표현을 담은 문자열을 돌려줘요. "Ow", "OwX" 등의 접두어는 생성되지 않아요. fmt를 쓰는 버전은 주어진 radix로 표현을 만들어요. 범위 [10,15]의 16진 숫자는 문자 #"A"부터 #"F"로 표현돼요. toString을 쓰는 버전은 fmt StringCvt.HEX i와 동등해요.

scan radix getc strm

fromString s

이 함수들은 문자 소스에서 word를 스캔해요. 첫 번째 버전은 문자 입력 함수 getc를 사용해 문자 스트림 strm의 접두부에서 radix가 나타내는 형식의 부호 없는 수를 파싱할 수 있으면 SOME(w,rest)로 평가돼요. 여기서 w는 파싱한 수의 값, rest는 문자 스트림 나머지예요. 초기 공백은 무시돼요. 그렇지 않으면 NONE을 돌려줘요. 수를 파싱할 수 있는데 타입 word에 맞지 않게 크면 Overflow를 발생시켜요. scan이 받는 형식은 radix 인자에 따라 달라져요. 이 형식을 정의하는 정규식은 다음과 같아요: Radix 형식 StringCvt.BIN (0w)?[0-1]+ StringCvt.OCT (0w)?[0-7]+ StringCvt.DEC (0w)?[0-9]+ StringCvt.HEX (0wx | 0wX | 0x | 0X)?[0-9a-fA-F]+ fromString 버전은 문자열 s의 접두부, 초기 공백을 무시하고, 형식 (0wx | 0wX | 0x | 0X)?[0-9a-fA-F]+의 부호 없는 16진수를 파싱할 수 있으면 SOME(w)를 돌려줘요. 여기서 w는 파싱한 수의 값이에요. 그렇지 않으면 NONE을 돌려줘요. 이 함수는 16진 숫자를 파싱할 수 있는데 타입 word로 표현하기엔 너무 크면 Overflow를 발생시켜요. 이 함수는 다음과 동등해요:

StringCvt.scanString (scan StringCvt.HEX)
```## 더 알아보기 (Learn more)

-