无符号整型的一道容易出错的题目

寅恪光潜
领域专家: 人工智能技术领域
2022-11-15 17:49:04
加精

5-10=?结果是多少?那很明显是-5,这是在有符号的范围,那是正确答案,如果是无符号呢?

package main

import (
	"fmt"
)

type Person struct {
	Name     string
	fmembers map[string]string
}

func main() {
	var i1 uint8 = 5
	var i2 uint8 = 10
	fmt.Printf("%08b,%v", i1-i2, i1-i2)
}

答案是251,是不是感觉有点神奇,其实这个还得从计算机只能识别二进制开始,对于有符号的情况,那么第一位表示符号,所以-5的二进制在有符号中的表示是11111011(-128+64+32+16+8+0+2+1=-5),那这个二进制当作无符号的情况就是251了。

换成有符号的看下二进制的情况:

func main() {
	var i1 int8 = 5
	var i2 int8 = 10
	fmt.Printf("%08b,%v", i1-i2, i1-i2)
}
//-0000101,-5

我们来看下无符号的整型的数值范围:

uint8:0 ~ 2^8-1=255
uint16:0 ~2^16-1=65535
uint32: 0 ~ 2^32-1=4294967295
uint64: 0 ~ 2^64-1=18446744073709552000

对应的有符号的范围就是除以2,负数+1,以及正数和0

int8:-128 ~ 127
int16:-32768-32767
int32:-2147483648-2147483647
int64:-9223372036854775808-9223372036854775807

...全文
20 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-编程语言 发布问题, 以便更快地解决您的疑问

198

社区成员

发帖
与我相关
我的任务
社区描述
从零开始的小白到进阶成技术达人。 一起学习,一起进步。
golanggo1.19 个人社区 贵州省·贵阳市
社区管理员
  • 寅恪光潜
  • 网络豆
  • Somnus_小凯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Go语言集各语言优势之大成,从基础到进阶

一起学习,一起进步,成为技术达人!

试试用AI创作助手写篇文章吧