整数类型
类型 | 取值范围 | 内存占用情况(字节) | 类型 | 取值范围 | 内存占用情况(字节) |
---|---|---|---|---|---|
int8 | -128~127 | 1 | uint8 | 0~255 | 1 |
int16 | -215 ~215-1 | 2 | uint16 | 0~216 | 2 |
int32 | -231 ~231-1 | 4 | uint32 | 0~232 | 4 |
int64 | -263 ~263-1 | 8 | uint64 | 0~264 | 8 |
一个字的位数,即字长,是计算机系统结构中的一个重要特性。字长在计算机结构和操作的多个方面均有体现。计算机中大多数寄存器的大小是一个字长。计算机处理的典型数值也可能是以字长为单位。CPU和内存之间的数据传送单位也通常是一个字长。还有内存中用于指明一个存储位置的地址也经常是以字长为单位的
架构特定(取决于系统位数)int uint
int 是用来表达寄存器的,指一个寄存器的大小也就是一个字长
当系统位数是64 int64 和 int 表示的取值范围是一样的,但是不是一个类型
package main
import "fmt"
func main1() {
var (
a int
b int64
)
fmt.Println(a, b)
fmt.Printf("a的类型是%T, b的类型是%T\n", a, b)
}
0 0
a的类型是int, b的类型是int64
补码
补码的意义就是拿补码和原码可以加出一个溢出的0
比如 -1 + 1 = 0
拿int8类型来看
0000 0000 表示0
0000 0001 表示1
因为 -1 = 0 - 1
即 0000 0000 - 0000 0001 借位后为 (1) 0000 0000 - 0000 0001 = 1111 1111
则 1111 1111 表示为 -1 即 1111 1111 作为纯二进制的数为255,作为补码时是-1
同理 对于 -a,其补码就是 0-a,实际是 2的n次方-a,n是这种类型的位数
所以int8的取值范围是-128~127 当最高位为1时表示负数,最高位为0时表示正数,还有一个特殊的0
数据的环
package main
import "fmt"
func main() {
var a int8 = 127
var b int8 = -128
var c uint8 = 255
fmt.Printf("a-1=%d, b+1=%d\n", a-1, b+1)
fmt.Printf("a+1=%d, b-1=%d\n", a+1, b-1)
fmt.Printf("c+1=%d\n", c+1)
}
a-1=126, b+1=-127
a+1=-128, b-1=127
c+1=0
以int8为例 因为有正负之分,所以负数就以补码的形式出现
127为0111 1111, 127+1为0111 1111 + 0000 0001 = 1000 0000
计算-128的补码 28-128 = 128的纯二进制表示为1000 000作为补码表示-128
同理-128为1000 0000,-128-1就是1000 0000 - 0000 0001 = 0111 1111
255+1即1111 1111 + 0000 0001 = (1) 0000 0000 因为uint8的范围只取了后面的八个0,所以就过就是0
unsigned
uint等并非是扩展数据能表达的范围,而是为了做纯二进制运算,主要是为了移位
八进制和十六进制
- 一个以0开头的数字字面量是八进制。
- 一个以0x开头的数字字面量是十六进制。
- 标准输出 二进制:%b,十进制:%d,八进制:%o,,十六进制:%x, %X。
- 八进制和十六进制是对数字是如何表达的,只是人规定的一种形式,与机器内部数字如何表达无关,其他进制也一样。
- 十六进制很适合表达二进制数据,因为4位二进制数据就是一位十六进制数。
- 八进制的一位正好表达了3位二进制,因为早期计算机的字长是12的倍数而非8。
package main
import "fmt"
func main() {
var (
a int = 077
b int = 0xfF
c int = 10
)
fmt.Printf("二进制10=%b\n", c)
fmt.Printf("十进制10=%d\n", c)
fmt.Printf("八进制10=%o\n", c)
fmt.Printf("十六进制10=%x\n", c)
fmt.Printf("十六进制10=%X\n", c)
fmt.Printf("八进制a=%o\n", a)
fmt.Printf("十六进制b=%x\n", b)
fmt.Printf("十六进制b=%X\n", b)
}
二进制10=1010
十进制10=10
八进制10=12
十六进制10=a
十六进制10=A
八进制a=77
十六进制b=ff
十六进制b=FF
选择整数的类型
- 为什么整数的类型需要那么多种:为了准确表达内存(做底层程序的时候需要)
- 没有特殊需要,就选用int
- 现在CPU的字长普遍32位或64位,一次内存读写就是一个int,一次计算也是一个int,选择更短的类型并不会更快
- 现代编译器一般会设计内存对齐,所以更短的类型实际在内存中也占据一个int的大小
- unsigned只是输出的不同,内部计算是一样的