😺

Go言語で整数の絶対値を返す関数を作る

2022/02/16に公開

Go言語のintは64bit環境か32bit環境でサイズが変わります。なんで、intの絶対値を計算する関数を作るのは少し考える必要があるのですが、今回分かったので共有します。

main.go
package main

import "fmt"

const intSize = 32 << (^uint(0) >> 63)

func abs(v int) int {
	y := v >> (intSize - 1)
	return (v ^ y) - y
}
func main() {
	fmt.Println(abs(-23))
	fmt.Println(abs(+45))
}

このintSizeというのはgoの標準ライブラリのfmt/scan.goで定義されているintBitsと同じです。32bit環境だとシフトなしで、64bit環境だと1回シフトするので、intSizeはそれぞれ32と64になるわけです。

実行はlinuxで次のように実行して確認しました。

$ GOARCH=386 go run .
23
45
$ GOARCH=amd64 go run .
23
45

Discussion