整型介绍

Go语言同时提供了有符号和无符号类型的整数运算。这里有 int8int16int32int64 四种截然不同大小的有符号整形数类型,分别对应 8、16、32、64 bit大小的有符号整形数,与此对应的是 uint8uint16uint32uint64 四种无符号整形数类型。

数据类型 说明 取值范围
有符号整数
int8 有符号 8位整数 -128到 127
int16 有符号 16位整数 -32768 到32767
int32 有符号 32位整数 -2147483648到2147483647
int64 有符号 64位整数 -9223372036854775808到9223372036854775807
无符号整数
uint8 无符号8位整数 0到255
uint16 无符号16位整数 0到65535
uint32 无符号32位整数 0到4294967295
uint64 无符号64位整数 0到18446744073709551615

u 开头的整数类型称为无符号整数类型。 无符号整数类型的值都是非负的。 一个数值类型名称中的数字表示每个这个类型的值将在内存中占有多少二进制位(以后简称位)。二进制位常称为比特(bit)。 比如,一个 uint8 的值将占有8位。 我们称 uint8 类型的值的尺寸是8位。 因此,最大的 uint8 值是 255(2^8 - 1 ), 最大的 int8 值是 127(2^7 - 1 ), 最小的 int8 值是 -128(-2^7)。

int8uint8 举例,8 代表 8个bit,能表示的数值个数有 2^8 = 256。

uint8 是无符号,能表示的都是正数,0-255,刚好256个数。

int8 是有符号,既可以正数,也可以负数,那怎么办?对半分呗,-128 ~ 127,也刚好 256个数。

int8int16int32int64 这几个类型的最后都有一个数值,这表明了它们能表示的数值个数是固定的。

类型别名

Go中有两种内置类型别名(type alias):

  • byteuint8 的内置别名。 我们可以将 byteuint8 看作是同一个类型。
  • runeint32 的内置别名。 我们可以将 runeint32 看作是同一个类型。

但是 intint64 不是同一种类型。

int 没有并没有指定它的位数,说明它的大小,是可以变化的

  • 当你在32位的系统下,intuint 都占用 4个字节,也就是32位。

  • 若你在64位的系统下,intuint 都占用 8个字节,也就是64位。

出于这个原因,在某些场景下,你应当避免使用 intuint ,而使用更加精确的 int32int64,比如在二进制传输、读写文件的结构描述(为了保持文件的结构不会受到不同编译目标平台字节长度的影响)

这里的有符号和无符号整数 intuint,一般对应特定的CPU平台机器字大小。int 在32位系统中是4字节,在64位系统中是8字节,但是我们不能对此做任何的假设;因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。

数值类型的零值都是零(但是不同类型的零在内存中占用的空间可能不同)。

关于 int 类型的取值范围,如果要把一个大的数字,放进小的数据类型则会放不进去。

var n int8
n=100
fmt.Println(n) //100 没有问题
//如果赋值为200 则不行 因为int8取值范围最大是127 var i2 uint8
i2=200
fmt.Println(i2) //200 uint8 取值范围最大是0到255

整数类型字面量

一个值的字面形式称为一个字面量,它表示此值在代码中文字体现形式(和内存中的表现形式相对应)。一个值可能会有很多种字面量形式。

整数类型值有四种字面量形式:十进制形式(decimal)、八进制形式(octal)、十六进制形式(hex)和二进制形式(binary)。 比如,下面的三个字面量均表示十进制的15:

0xF // 十六进制表示(必须使用0x或者0X开头)
0XF 017 // 八进制表示(必须使用0、0o或者0O开头)
0o17
0O17 0b1111 // 二进制表示(必须使用0b或者0B开头)
0B1111 15 // 十进制表示(必须不能用0开头)

(注意:二进制形式和以0o或0O开头的八进制形式从Go 1.13开始才支持。)

下面用一段代码分别使用二进制、八进制、十六进制来表示十进制的数值:12

package main

import (
"fmt"
) func main() {
var num01 int = 0b1100
var num02 int = 0o14
var num03 int = 0xC fmt.Printf("2进制数 %b 表示的是: %d \n", num01, num01)
fmt.Printf("8进制数 %o 表示的是: %d \n", num02, num02)
fmt.Printf("16进制数 %X 表示的是: %d \n", num03, num03)
}

输出

2进制数 1100 表示的是: 12
8进制数 14 表示的是: 12
16进制数 C 表示的是: 12

以上代码用过了 fmt 包的格式化功能

%b    表示为二进制
%c 该值对应的unicode码值
%d 表示为十进制
%o 表示为八进制
%q 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
%x 表示为十六进制,使用a-f
%X 表示为十六进制,使用A-F
%U 表示为Unicode格式:U+1234,等价于"U+%04X"

rune值的字面量形式

上面已经提到,rune 类型是 int32 类型的别名。因此,rune 类型(泛指)是特殊的整数类型。一个 rune 值可以用上面已经介绍的整数类型的字面量形式表示。另一方面,很多各种整数类型的值也可以用 rune 字面量形式来表示。

在Go中,一个 rune 值表示一个 Unicode 码点。一般说来,我们可以将一个 Unicode 码点看作是一个 Unicode 字符。但是我们也应该知道,有些 Unicode 字符由多个 Unicode 码点组成。每个英文或中文 Unicode 字符值含有一个 Unicode码点。

一个 rune 字面量由若干包在一对单引号中的字符组成。 包在单引号中的字符序列表示一个 Unicode 码点值。 rune 字面量形式有几个变种,其中最常用的一种变种是将一个 rune 值对应的 Unicode 字符直接包在一对单引号中。比如:

'a' // 一个英文字符
'π'
'众' // 一个中文字符

下面这些rune字面量形式的变种和 'a' 是等价的 (字符a的Unicode值是97)。

'\141'   // 141是97的八进制表示
'\x61' // 61是97的十六进制表示
'\u0061'
'\U00000061'

注意:\ 之后必须跟随三个八进制数字字符(0-7)表示一个byte值, \x 之后必须跟随两个十六进制数字字符(0-9,a-f和A-F)表示一个byte值, \u 之后必须跟随四个十六进制数字字符表示一个rune值(此rune值的高四位都为0), \U 之后必须跟随八个十六进制数字字符表示一个rune值。 这些八进制和十六进制的数字字符序列表示的整数必须是一个合法的Unicode码点值,否则编译将失败。

下面这些 println 函数调用都将打印出 true

package main

func main() {
println('a' == 97)
println('a' == '\141')
println('a' == '\x61')
println('a' == '\u0061')
println('a' == '\U00000061')
println(0x61 == '\x61')
println('\u4f17' == '众')
}

事实上,在日常编程中,这四种 rune 字面量形式的变种很少用来表示 rune 值。 它们多用做字符串的双引号字面量形式中的转义字符。

如果一个 rune 字面量中被单引号包起来的部分含有两个字符, 并且第一个字符是 \,第二个字符不是 xuU,那么这两个字符将被转义为一个特殊字符。 目前支持的转义组合为:

\a   (rune值:0x07) 铃声字符
\b (rune值:0x08) 退格字符(backspace)
\f (rune值:0x0C) 换页符(form feed)
\n (rune值:0x0A) 换行符(line feed or newline)
\r (rune值:0x0D) 回车符(carriage return)
\t (rune值:0x09) 水平制表符(horizontal tab)
\v (rune值:0x0b) 竖直制表符(vertical tab)
\\ (rune值:0x5c) 一个反斜杠(backslash)
\' (rune值:0x27) 一个单引号(single quote)

其中,\n 在日常编程中用得最多。

一个例子:

println('\n') // 10
println('\r') // 13
println('\'') // 39 println('\n' == 10) // true
println('\n' == '\x0A') // true

rune 类型的零值常用 '\000''\x00''\u0000' 等来表示。

基本数值类型字面量的适用范围

一个数值型的字面量只有在不需要舍入时,才能用来表示一个整数基本类型的值。 比如,1.0 可以表示任何基本整数类型的值,但 1.01 却不可以。 当一个数值型的字面量用来表示一个非整数基本类型的值时,舍入(或者精度丢失)是允许的。

每种数值类型有一个能够表示的数值范围。 如果一个字面量超出了一个类型能够表示的数值范围(溢出),则在编译时刻,此字面量不能用来表示此类型的值。

下表是一些例子:

字面表示 此字面表示可以表示哪些类型的值(在编译时刻)
256 除了int8和uint8类型外的所有的基本数值类型。
255 除了int8类型外的所有的基本数值类型。
-123 除了无符号整数类型外的所有的基本数值类型。
123 所有的基本数值类型。
123.000 所有的基本数值类型。
1.23e2 所有的基本数值类型。
'a' 所有的基本数值类型。
1.0+0i 所有的基本数值类型。
1.23 所有浮点数和复数基本数值类型。
0x10000000000000000 (16 zeros) 所有浮点数和复数基本数值类型。
3.5e38 除了float32和complex64类型外的所有浮点数和复数基本数值类型。
1+2i 所有复数基本数值类型。
2e+308 无。

注意几个溢出的例子:

  • 字面量 0x10000000000000000 需要65个比特才能表示,所以在运行时刻,任何基本整数类型都不能精确表示此字面量。
  • 在IEEE-754标准中,最大的可以精确表示的 float32 类型数值为 3.40282346638528859811704183484516925440e+38,所以 3.5e38 不能表示任何 float32complex64 类型的值。
  • 在IEEE-754标准中,最大的可以精确表示的 float64 类型数值为 1.797693134862315708145274237317043567981e+308,因此 2e+308 不能表示任何基本数值类型的值。
  • 尽管 0x10000000000000000 可以用来表示 float32 类型的值,但是它不能被任何 float32 类型的值所精确表示。上面已经提到了,当使用字面量来表示非整数基本数值类型的时候,精度丢失是允许的(但溢出是不允许的)。

Golang 入门 : 整型的更多相关文章

  1. python基础入门 整型 bool 字符串

    整型,bool值,字符串 一.整型 整型十进制和二进制 整型:整型在Python中的关键字用int来表示; 整型在计算机中是用于计算和比较的 可进行+ - * / % //(整除) **(幂运算) 十 ...

  2. Python入门篇-基础数据类型之整型(int),字符串(str),字节(bytes),列表(list)和切片(slice)

    Python入门篇-基础数据类型之整型(int),字符串(str),字节(bytes),列表(list)和切片(slice) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Py ...

  3. golang的数据类型之整型类型

    数据类型: 整数 : int, int32, int64, uint, uint32, uint64 字符串 : string 布尔:bool 浮点:float32 float64 uint 表示无符 ...

  4. Golang的基础数据类型-整型

    Golang的基础数据类型-整型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.整型概述 Go语言的整数类型一共有10个. int: 默认是有符号(signed)整形,占用空间 ...

  5. golang 整型

    目录 前言 整型 1.分类 2.类型 3.类型补充 4.补充: 跳转 前言 不做文字的搬运工,多做灵感性记录 这是平时学习总结的地方,用做知识库 平时看到其他文章的相关知识,也会增加到这里 随着学习深 ...

  6. GOLANG 基本数据类型 整型

    基本数据类型-整型 种类     有符号(负号)      int8 int16 int32 int64 无符号(无符号) uint8 uint16 uint32 uint64 架构特定(取决于系统位 ...

  7. 【C语言入门教程】2.3 整型数据

    没有小数位或指数的数据类型被称为整型数据,根据使用方法的分类,整型数据可分为整型常量和整型变量.根据定义或显示的数制分类,可分为十进制.八进制和十六进制. 2.3.1 整型常量 整型常量是在运算中不可 ...

  8. Linux漏洞分析入门笔记-CVE_2018_6323_整型溢出

    操作系统   Ubuntu 16.04 /32 位 调试器     IDA pro 7.0 漏洞软件   binutils-2.29.1 0x00: 漏洞描述 1.什么是整数溢出: 在计算机中,整数分 ...

  9. 从入门到自闭之Python整型,字符串以及for循环

    Day 01 整型: 对比: 在python 2 版本中有整型,长整型long 在python 3 版本中全部都是整型 用于计算和比较 整型和布尔值的转换 二进制转换成十进制: ​ print (in ...

  10. python小白入门基础(三:整型)

    # Number(int float str complex) #int 整型(正整数 0 负整数)intvar_1 = 100print(intvar_1)invar_2 = 0 print(inv ...

随机推荐

  1. 鸿蒙OS创新实践:动态声控话筒开发指南

    前言 在鸿蒙OS的生态中,开发者们不断探索和创新,以期为用户带来更丰富的交互体验.最近,我萌生了一个想法:制作一个能够随着声音动态变化的话筒组件.尽管网络上缺乏现成的参考案例,但我决定亲自动手,将这一 ...

  2. 安装OpenCV时提示缺少boostdesc_bgm.i文件的问题解决方案

    安装OpenCV时,会遇到下面的错误 /home/zhang/slam/opencv-3.4.5/opencv_contrib/modules/xfeatures2d/src/boostdesc.cp ...

  3. 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等

    本文作者潘唐磊,腾讯WXG(微信事业群)开发工程师,毕业于中山大学.内容有修订. 1.内容概述 本文总结了企业微信的IM消息系统架构设计,阐述了企业业务给IM架构设计带来的技术难点和挑战,以及技术方案 ...

  4. mac_使用Charles抓取Firefox 链接

    1. 首先在Charles 中导出证书,操作为:Help选项 --> SSL Proxying --> 选择第二项 Install Charles Root Certificate 2. ...

  5. Eval-Expression.NET:动态执行C#脚本,类似Javascript的Eval函数功能

    我们都知道在JavaScript中,我们可以通过Eval来执行JavaScript字符串代码. 下面推荐一个.Net版本的Eval的开源项目. 01 项目简介 Eval-Expression.NET是 ...

  6. java线程用法和区别

    从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务.但是当前正在被服务的线程可能觉得cpu的服务质量不够 ...

  7. linux:lnmp环境

    简介 LNMP 环境是指在 Linux 系统下,由 Nginx + MySQL/MariaDB + PHP 组成的网站服务器架构. 配置 软件介绍 linux:centos6.5 ngnix:ngin ...

  8. 使用Vant做移动端对图片预览ImagePreview和List的理解

    使用Vant3做移动端的感受 最近在使用Vant3做移动端. 感觉还可以,使用起来也简单,但是也遇见一些坑. 图片预览ImagePreview的使用 在使用图片预览的时候, 我们在main.js中进行 ...

  9. 基于生成式AI的访问控制, 迁移传统安全策略到基于LLM的风险分类器

    基于规则的风险分类 风险分类是网络安全系统的核心能力之一,它将访问请求和命令映射到其风险级别/类别:高(High).中(Medium).低(Low).目前,即便是在大规模环境中,风险分类器仍主要采用基 ...

  10. 安装VMware

    安装VMware 官网下载 首先需要进行账号注册:https://support.broadcom.com/ 注册完成后,进行账号登录:https://login.broadcom.com/signi ...