golang基础数据类型-整型

大白能_3db0 · · 396 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go同时提供了有符号和无符号的整数类型

有符号

// int8 is the set of all signed 8-bit integers.
// Range: -128 through 127.
type int8 int8

// int16 is the set of all signed 16-bit integers.
// Range: -32768 through 32767.
type int16 int16

// int32 is the set of all signed 32-bit integers.
// Range: -2147483648 through 2147483647.
type int32 int32

// int64 is the set of all signed 64-bit integers.
// Range: -9223372036854775808 through 9223372036854775807.
type int64 int64

无符号

// uint8 is the set of all unsigned 8-bit integers.
// Range: 0 through 255.
type uint8 uint8

// uint16 is the set of all unsigned 16-bit integers.
// Range: 0 through 65535.
type uint16 uint16

// uint32 is the set of all unsigned 32-bit integers.
// Range: 0 through 4294967295.
type uint32 uint32

// uint64 is the set of all unsigned 64-bit integers.
// Range: 0 through 18446744073709551615.
type uint64 uint64

和平台相关

无固定大小,和特定平台相关,32位平台就是32位,64位平台就是64位

// int is a signed integer type that is at least 32 bits in size. It is a
// distinct type, however, and not an alias for, say, int32.
type int int

// uint is an unsigned integer type that is at least 32 bits in size. It is a
// distinct type, however, and not an alias for, say, uint32.
type uint uint

别名

一般只有处理字符的时候使用

// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is
// used, by convention, to distinguish byte values from 8-bit unsigned
// integer values.
type byte = uint8

// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32

针对指针

还有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针。

uintptr类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。

// uintptr is an integer type that is large enough to hold the bit pattern of
// any pointer.
type uintptr uintptr

零值和默认类型

func TestInt1(t *testing.T) {
   // 零值0
   var num1 int8
   fmt.Println(num1) // 0
     
   // 默认类型int
   num2 := 10
   fmt.Println(reflect.TypeOf(num2), num2) // int 10
}

有符号和无符号的选择

虽然go同时提供了有符号和无符号的整数类型,但是大多数情况下,我们编码过程中还是更加倾向于使用有符号的int类型。比如说数组的长度,虽然不可能为负数,但是内置的len函数返回的还是一个有符号的int,这样做是有原因的,看以下代码:

func TestInt1(t *testing.T) {
   medals := []string{"gold", "silver", "bronze"}
   for i := len(medals) - 1; i >= 0; i-- {
      fmt.Println(medals[i]) // "bronze", "silver", "gold"
   }
}

如果说len返回的是一个无符号的整数类型,那么i也是一个无符号的整数类型,i--一直不会小于0,则i >= 0一直为真

无符号数往往只有在位运算或其它特殊的运算场景才会使用,就像bit集合、分析二进制文件格式或者是哈希和加密操作等。它们通常并不用于仅仅是表达非负数量的场合。

边界值

math包里面已经定义了

// Integer limit values.
const (
   MaxInt8   = 1<<7 - 1
   MinInt8   = -1 << 7
   MaxInt16  = 1<<15 - 1
   MinInt16  = -1 << 15
   MaxInt32  = 1<<31 - 1
   MinInt32  = -1 << 31
   MaxInt64  = 1<<63 - 1
   MinInt64  = -1 << 63
   MaxUint8  = 1<<8 - 1
   MaxUint16 = 1<<16 - 1
   MaxUint32 = 1<<32 - 1
   MaxUint64 = 1<<64 - 1
)

范围溢出,不会报错

func TestInt(t *testing.T) {
   // 上限溢出
   var num1 int8 = math.MaxInt8
   fmt.Println(num1) // 127
   num1++
   fmt.Println(num1) // -128

   // 下限溢出
   var num2 int16 = math.MinInt16
   fmt.Println(num2) // -32768
   num2--
   fmt.Println(num2) // 32767
  
   // 无符号整数
   var i uint8 = 0
   i--
   fmt.Println(i) // 255
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:大白能_3db0

查看原文:golang基础数据类型-整型

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

396 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传