안녕하세요. 개발자 모도리입니다.
The Go Programming Language 라는 책으로 Go를 공부하고 있으며, 해당 책의 내용을 요약 정리해서 올리려고 합니다. 저는 번역본을 구매해서 공부하고 있습니다.
게시물에 예제코드 라고 나오는 것들은 https://github.com/modolee/tgpl.git 에서 다운 받으실 수 있습니다.
* / % << >> & &^ + - | ^ == != < <= > >= && ||* 이항 연산자의 우선순위는 다섯 단계이며, 동일한 수준의 연산자는 왼쪽으로 연관됩니다. * 보다 명확하게 연산순서를 지정하고 싶으면 괄호를 사용해야 합니다. * 예 : `mask & (1 << 28)` 동일한 수준이지만 괄호를 먼저 수행
+, -, *, /는 정수, 부동소수점 수와 복소수에 사용할 수 있지만, 나머지 연산자 %는 정수에만 사용할 수 있습니다.%의 동작은 프로그래밍 언어별로 다양합니다.-5%3, -5%-3 모두 -2입니다./ 연산은 피연산자의 타입에 따라 달라서, 5.0/4.0 == 1.25, 5/4 == 1 와 같은 결과가 나옵니다. 정수 나눗셈은 소수점 이하는 버립니다.package main
import "fmt"
func main() {
var u uint8 = 255
fmt.Println(u, u+1, u*u) // "255 0 1"
var i int8 = 127
fmt.Println(i, i+1, i*i) // "127 -128 1"
}
예제코드 [tgpl/ch3/overflow/main.go]
코드 설명
부호없는 255를 비트로 표현하면11111111입니다.
u+1: 255에 1을 더하면100000000이 됩니다. 맨 왼쪽 1자리를 제외한 8자리만 uint8에 담기게 되어00000000이 됩니다.
u*u: 255 곱하기 255를 하게 되면 오른쪽 8자리가00000001이 됩니다.
부호있는 127을 비트로 표현하면01111111입니다.
i+1: 127에 1을 더하면 오른쪽 8자리가10000000이 되는데, 부호 있는 숫자 표현에서는 -128을 나타냅니다.
i*i: 127 곱하기 127을 하게 되면 오른쪽 8자리가00000001가 되어 1이 됩니다.
- 음수 표현에 대한 자세한 내용은 음수 표현법 - 2의 보수 이 글을 참고해 주세요
== 일치 != 불일치 < 미만 <= 이하 > 초과 >= 이상
+x는 0+x의 축약형이고, -x는 0-x의 축약형입니다.+x는 그냥 x이고, -x는 x의 부정입니다.+ 단항 긍정 (효과 없음) - 단항 부정
& 비트 단위 AND | 비트 단위 OR ^ 비트 단위 XOR &^ 비트 제거 (AND NOT) << 왼쪽 시프트 >> 오른쪽 시프트
package main
import "fmt"
func main() {
var x uint8 = 1<<1 | 1<<5
var y uint8 = 1<<1 | 1<<2
fmt.Printf("%08b\n", x) // "00100010", 집합 {1, 5}
fmt.Printf("%08b\n", y) // "00000110", 집합 {1, 2}
fmt.Printf("%08b\n", x&y) // "00000010", 교집합 {1}
fmt.Printf("%08b\n", x|y) // "00100110", 집합 {1, 2, 5}
fmt.Printf("%08b\n", x^y) // "00100100", 교집합 {2, 5}
fmt.Printf("%08b\n", x&^y) // "00000010", 차집합 {5}
for i := uint(0); i < 8; i++ {
if x&(1<<i) != 0 { // 멤버 확인
fmt.Println(i) // "1", "5"
}
}
fmt.Printf("%08b\n", x<<1) // "01000100", 집합 {2, 6}
fmt.Printf("%08b\n", x>>1) // "00010001", 집합 {0, 4}
}
예제 코드 [tgpl/ch3/bit_op/main.go]
실행 결과
$ go run tgpl/ch3/bit_op
00100010
00000110
00000010
00100110
00100100
00100000
1
5
01000100
00010001
medals := []string{"gold", "silver", "bronze"}
for i := len(medals) - 1; i >= 0; i-- {
fmt.Println(medals[i]) // "bronze", "silver", "gold"
}
var apples int32 = 1
var oranges int16 = 2
var compote int = apples + oranges // 컴파일 오류
var compote = int(apples) + int(oranges) // 오류 없음
정밀도가 변하는 타입 변환
f := 3.141 // a float64
i := int(f)
fmt.Println(f, i) // "3.141 3"
f = 1.99
fmt.Println(int(f)) // "1"
f := 1e100 // a float64
i := int(f) // 결과는 구현 별로 다름
package main
import "fmt"
func main() {
o := 0666
fmt.Printf("%d %[1]o %#[1]o\n", o) // "438 666 0666"
x := int64(0xdeadbeef)
fmt.Printf("%d %[1]x %#[1]x %#[1]X\n", x)
// output:
// 3735928559 deadbeef 0xdeadbeef 0xDEADBEEF
}
예제 코드 [tgpl/ch3/main.go]