关于无符号类型的坑
前言#
国家结束了又到了上班一天,刚好无心敲代码,就把国庆学习的东西总结下。
引言#
在国庆前有个面试题 (Golang 的面试题),是我无意中看到的
func main() {
var a uint = 2
var b uint = 3
a - b = ?
}
关于这道题,如果没有回答出来,说明是基础确实薄弱(我答不出来),既然弱就补。然后我就又翻开了当时我没看完的《深入理解操作系统》,这次必须啃完成它,加油。
关于无符号转补码#
什么是补码#
关于这个问题要理解什么是补码:在以前老师是一句话带过,补码是反码加 1。
关于这点我们来分析一下, 补码是首位如果是 1 的话就是负数。举个例子假定这个类型就 4 位是为了方便分析:0111 = 4+2+1 = 7 ; 1111 = -8 + 4 + 2 +1 = -1 ;
无符号,补码互相转换#
首先要知道一个基础知识。计算机不知道你这个首字母是不是负数。它的转换全靠两个公示 (这部分只需要了解下就行了。不知道的时候查一下就是。这我就不信面试直接让你出公式)
无符号数编码的定义:
举个例子
当 x = 0001 时
补码编码的定义
举个例子
当 x = 0001 时
当 x = 1001 时
这两个公示看下就行了,毕竟我们不是为了考试。如果计算机遇到无符号就走公式一补码就是公式二。所以如果我们定义为无符号。这个结果应该是。
func main() {
var a uint = 2
var b uint = 3
a - b = ?
}
按照我们的之前的结论(假设有 4 位):2-3 应该是 - 1 。-1 应该是 1111 = -8+4+2+1 = -1; 但是这里是无符号。所以计算机会直接使用 1111 = 8+4+2+1 = 15 ;所以这个结果取决于这个 uint 长度。由于在 Go 中这个长度是随操作系统系统位数来定。所以这个具体数值取决于操作系统位数。
推荐文章: