数値

数値 #

整数を10進数・2進数・8進数・16進数で表す #

整数リテラルには10進数・2進数・8進数・16進数で表せる。 10進数はそのまま表記する。 2進数は 0[bB] を接頭辞とする。 8進数は 0[oO] を接頭辞とする。 16進数は 0[xX] を接頭辞とする。 どの表記でも読みやすくするために数字と数字の間に区切り文字として _ を挿入することができる。

package main

import (
	"fmt"
)

func main() {
	// 10進数
	fmt.Println(42)
	fmt.Println(100_000) // == 100000

	// 2進数
	fmt.Println(0b0001)       // == 1
	fmt.Println(0B0010)       // == 2
	fmt.Println(0b_1111_1111) // == 255

	// 8進数
	fmt.Println(0o10) // == 8
	fmt.Println(0O11) // == 9

	// 16進数
	fmt.Println(0x10)         // == 16
	fmt.Println(0X_Cafe_BABE) // == 3405691582
}
play_circleRun open_in_newRun In The Playground

浮動小数点数を10進数・16進数・指数表記で表す #

浮動小数点数リテラルには10進数・16進数・指数表記で表せる。 10進数はそのまま表記する。 16進数は 0[xX] を接頭辞とする。 10進数の指数表記は 仮数部[eE](+-)?指数部 と表記する。 16進数の指数表記は 0[xX]仮数部[pP](+-)?指数部 と表記する。 どの表記でも読みやすくするために数字と数字の間に区切り文字として _ を挿入することができる。

package main

import (
	"fmt"
)

func main() {
	// 10進数
	fmt.Println(123.456)
	fmt.Println(0.123_456) // == 0.123456
	fmt.Println(042.0) // == 42

	// 整数部分か小数部分は省略できる
	fmt.Println(123.) // == 123
	fmt.Println(.123) // == 0.123

	// 10進数の指数表記
	fmt.Println(.345e2) // == 34.5
	fmt.Println(1e2)    // == 100
	fmt.Println(.678e+1) // == 6.78
	fmt.Println(.678e-1) // == 0.0678

	// 16進数表記指数表記
	fmt.Println(0x1p-2)  // == 0.25
	fmt.Println(0X2.P10) // == 2048.0
}
play_circleRun open_in_newRun In The Playground

最大値と最小値 #

package main

import (
	"fmt"
	"math"
)

func main() {
	// int8
	fmt.Println(math.MaxInt8) // == 127
	fmt.Println(math.MinInt8) // == -128

	// int16
	fmt.Println(math.MaxInt16) // == 32767
	fmt.Println(math.MinInt16) // == -32768

	// int32
	fmt.Println(math.MaxInt32) // == 2147483647
	fmt.Println(math.MinInt32) // == -2147483648

	// int64
	fmt.Println(math.MaxInt64) // == 9223372036854775807
	fmt.Println(math.MinInt64) // == -9223372036854775808

	// uint8
	fmt.Println(math.MaxUint8) // == 255

	// uint16
	fmt.Println(math.MaxUint16) // == 65535

	// uint32
	fmt.Println(math.MaxUint32) // == 4294967295

	// uint64
	// math.MaxUint64 をそのまま実行すると int として扱おうとしてエラーになるために型を指定している
	fmt.Println(uint64(math.MaxUint64)) // == 18446744073709551615

	// float32
	fmt.Println(math.MaxFloat32)             // == 3.4028234663852886e+38
	fmt.Println(math.SmallestNonzeroFloat32) // == 1.401298464324817e-45

	// float64
	fmt.Println(math.MaxFloat64)             // == 1.7976931348623157e+308
	fmt.Println(math.SmallestNonzeroFloat64) // == 5e-324
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: math

四則演算をする #

package main

import (
	"fmt"
)

func main() {
	// 四則演算
	fmt.Println(1 + 2) // == 3
	fmt.Println(1 - 2) // == -1
	fmt.Println(1 * 2) // == 2
	fmt.Println(4 / 2) // == 2

	// 剰余
	fmt.Println(42 % 4) // == 2

	// 整数の割り算では小数点以下は切り捨て
	fmt.Println(1 / 2) // == 0

	// 型が違うと計算できないのでキャストする
	i := 100
	f := .1
	fmt.Println(float64(i) + f)

	// 0 で割ると panic
	z := 0
	fmt.Println(100 / z)
}
play_circleRun open_in_newRun In The Playground

小数点以下の切り上げ・切り捨て・四捨五入をする #

package main

import (
	"fmt"
	"math"
)

func main() {
	f1 := 1.18
	f2 := 2.51

	// 切り上げ
	fmt.Println(math.Ceil(f1)) // == 2.0
	fmt.Println(math.Ceil(f2)) // == 3.0

	// 切り捨て
	fmt.Println(math.Floor(f1)) // == 1.0
	fmt.Println(math.Floor(f2)) // == 2.0

	// 四捨五入
	fmt.Println(math.Floor(f1 + 0.5)) // == 1.0
	fmt.Println(math.Floor(f2 + 0.5)) // == 3.0
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: math

型変換 #

package main

import (
	"fmt"
	"math"
)

func main() {
	// `型名(値)` で型変換をする
	var i8 int8 = 1
	var i16 int16 = int16(i8)
	fmt.Println(i16)

	// 整数から浮動小数点数への変換
	var f64 float64 = float64(i8)
	fmt.Println(f64)

	// 容量が小さい型から大きい型への変換は安全
	var i8m int8 = math.MaxInt8
	var i32 int32 = int32(i8m)
	fmt.Println(i32)

	// 容量が大きい型から小さい型への変換は意図しない値になることがある
	i32 = math.MaxInt32
	i8 = int8(i32)
	fmt.Println(i8) // == -1

	// 符号付整数から符号なし整数への変換は意図しない値になることがある
	var i int64 = -1
	var ui uint64 = uint64(i)
	fmt.Println(ui) // == 18446744073709551615
}
play_circleRun open_in_newRun In The Playground

整数を整形して表示する #

package main

import (
	"fmt"
)

func main() {
	i := 42

	// `%d` で10進数で表示
	fmt.Printf("%d\n", i) // => 42

	// `%{数字}d` で文字幅の指定
	fmt.Printf("%10d\n", i) // => "       42"

	// `%{0数字}d` で文字幅の指定(0パディング)
	fmt.Printf("%010d\n", i) // => "0000000042"

	// `%b` で2進数で表示
	fmt.Printf("%b\n", i) // => 101010

	// `%o` か `%O` で8進数で表示
	// `%O` なら接頭辞に `0o` を付与する
	fmt.Printf("%o, %O\n", i, i) // => "52, 0o52"

	// `%x` か `%X` で16進数で表示
	// `%x` なら 10-15 に a-f を使い `%X` なら A-F を使う
	fmt.Printf("%x, %X\n", i, i) // => "2a, 2A"

	// `%c` で整数を Unicode のコードポイントとして評価して文字を表示する
	fmt.Printf("%c\n", i) // => "*"

	// `%q` で `%c` の文字をシングルクォートで囲む
	fmt.Printf("%q\n", i) // => "'*'"

	// `%U` で整数を Unicode のコードポイントとして評価して `U+NNNN` というフォーマットで表示する
	fmt.Printf("%U\n", i) // => "U+002A"
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: fmt

浮動小数点数を整形して表示する #

package main

import (
	"fmt"
)

func main() {
	f := 123.456

	// `%f` で10進数で表示
	fmt.Printf("%f\n", f) // => 123.456000

	// `%{.数値}f` で小数部分の有効桁数を指定
	fmt.Printf("%.0f\n", f)  // => 123
	fmt.Printf("%.1f\n", f)  // => 123.5
	fmt.Printf("%.10f\n", f) // => 123.4560000000

	// `%{数値.}f` で表示幅を指定
	fmt.Printf("%10.1f\n", f) // => "     123.5"
	fmt.Printf("%20.2f\n", f) // => "              123.46"

	// `%{0数値.}f` で表示幅を指定(0パディング)
	fmt.Printf("%010.1f\n", f) // => "00000123.5"
	fmt.Printf("%020.2f\n", f) // => "00000000000000123.46"

	// `%b` で2進数で表示
	fmt.Printf("%b\n", f) // => 8687443681197687p-46

	// `%e` で指数を使った表記 `%E` は大文字バージョン
	fmt.Printf("%e\n", f) // => 1.234560e+02
	fmt.Printf("%E\n", f) // => 1.234560E+02

	// `%x` は16進数で表示. `%X` は大文字バージョン
	fmt.Printf("%x\n", f) // => 0x1.edd2f1a9fbe77p+06
	fmt.Printf("%X\n", f) // => 0X1.EDD2F1A9FBE77P+06

	// `%g` は小さい数なら `%f` と同様で、大きくなると `%e` になる
	fmt.Printf("%g\n", f)          // => 123.456
	fmt.Printf("%g\n", 1234567.89) // => 1.23456789e+06

	// `%G` は `%g` の大文字バージョン
	fmt.Printf("%G\n", f)          // => 123.456
	fmt.Printf("%G\n", 1234567.89) // => 1.23456789E+06
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: fmt

乱数 #

package main

import (
	cryptorand "crypto/rand"
	"fmt"
	mathrand "math/rand"
	"time"
)

func main() {
	// math/rand による擬似乱数の生成
	// rand.Seed でシード値を指定して rand.Intn で 0 から n-1 までの中からランダムに数字を抽選します
	// ある程度ばらけた数字を高速に生成できますが、パスワードなどセキュリティ要求の高い用途には向いていません
	mathrand.Seed(time.Now().UnixNano())
	fmt.Println(mathrand.Intn(100)) // == 0

	// crypto/rand による乱数の生成
	// math/rand に比べて低速だがセキュリティ要件の高い用途にも利用できる
	b := make([]byte, 10)
	_, err := cryptorand.Read(b)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%+v\n", b) // == [27 66 7 91 131 110 66 201 67 204] (これは実行ごとにランダムになる)
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: math/rand , crypto/rand

累乗・絶対値・最大値・最小値を計算する #

package main

import (
	"fmt"
	"math"
)

func main() {
	// 累乗
	fmt.Println(math.Pow(2, 3))  // == 8
	fmt.Println(math.Pow(10, 4)) // == 10000

	// 絶対値
	fmt.Println(math.Abs(100))  // == 100
	fmt.Println(math.Abs(-100)) // == 100

	// 最大値
	fmt.Println(math.Max(1, 2)) // == 2

	// 最小値
	fmt.Println(math.Min(1, 2)) // == 1
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: math

ビット演算 #

package main

import (
	"fmt"
)

func main() {
	a := 0b1111_0000
	b := 0b0011_1100

	// AND
	fmt.Printf("%b\n", a&b) // == 110000

	// OR
	fmt.Printf("%b\n", a|b) // == 11111100

	// XOR
	fmt.Printf("%b\n", a^b) // == 11001100

	// AND NOT
	fmt.Printf("%b\n", a&^b) // == 11000000

	// 左シフト
	fmt.Printf("%b\n", b<<1) // == 1111000

	// 右シフト
	fmt.Printf("%b\n", b>>1) // == 11110
}
play_circleRun open_in_newRun In The Playground