go_整数

整数类型

类型取值范围内存占用情况(字节)类型取值范围内存占用情况(字节)
int8-128~1271uint80~2551
int16-215 ~215-12uint160~2162
int32-231 ~231-14uint320~2324
int64-263 ~263-18uint640~2648

一个字的位数,即字长,是计算机系统结构中的一个重要特性。字长在计算机结构和操作的多个方面均有体现。计算机中大多数寄存器的大小是一个字长。计算机处理的典型数值也可能是以字长为单位。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 = 0int8类型来看
0000 0000 表示0
0000 0001 表示1
因为 -1 = 0 - 10000 0000 - 0000 0001 借位后为 (1) 0000 0000 - 0000 0001 = 1111 11111111 1111 表示为 -11111 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等并非是扩展数据能表达的范围,而是为了做纯二进制运算,主要是为了移位

八进制和十六进制

  1. 一个以0开头的数字字面量是八进制。
  2. 一个以0x开头的数字字面量是十六进制。
  3. 标准输出 二进制:%b,十进制:%d,八进制:%o,,十六进制:%x, %X。
  4. 八进制和十六进制是对数字是如何表达的,只是人规定的一种形式,与机器内部数字如何表达无关,其他进制也一样。
  5. 十六进制很适合表达二进制数据,因为4位二进制数据就是一位十六进制数。
  6. 八进制的一位正好表达了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

选择整数的类型

  1. 为什么整数的类型需要那么多种:为了准确表达内存(做底层程序的时候需要)
  2. 没有特殊需要,就选用int
  3. 现在CPU的字长普遍32位或64位,一次内存读写就是一个int,一次计算也是一个int,选择更短的类型并不会更快
  4. 现代编译器一般会设计内存对齐,所以更短的类型实际在内存中也占据一个int的大小
  5. unsigned只是输出的不同,内部计算是一样的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值