关于无符号类型的坑

前言

国家结束了又到了上班一天,刚好无心敲代码,就把国庆学习的东西总结下。

引言

在国庆前有个面试题(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 ;

无符号,补码互相转换

首先要知道一个基础知识。计算机不知道你这个首字母是不是负数。它的转换全靠两个公示 (这部分只需要了解下就行了。不知道的时候查一下就是。这我就不信面试直接让你出公式)
无符号数编码的定义:

B2Uw(\overrightarrow{x}) \doteq \displaystyle \sum_{i=0}^{w-1} x\tiny i \footnotesize2^i

举个例子
当x = 0001时

B2U\tiny 4\footnotesize([0001]) = 0 * 2^3 + 0 * 2^2 + 0 * 2 ^1 + 0 * 2^0 =0 + 0 + 0 + 1= 1

补码编码的定义

B2Tw(\overrightarrow{x}) \doteq x\tiny {w-1} \footnotesize2^{w-1} + \displaystyle \sum_{i=0}^{w-2}x\tiny i \footnotesize2^i

举个例子
当x = 0001时

B2T\tiny 4\footnotesize([0001]) = -0 * 2^3 + 0 * 2^2 + 0 * 2 ^1 + 1 * 2^0= -0 + 0 + 0 + 1= 1

当x = 1001时

B2T\tiny 4\footnotesize([1001]) = -1 * 2^3 + 0 * 2^2 + 0 * 2 ^1 + 1 * 2^0= -8 + 0 + 0 + 1= -7

这两个公示看下就行了,毕竟我们不是为了考试。如果计算机遇到无符号就走公式一补码就是公式二。所以如果我们定义为无符号。这个结果应该是。


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中这个长度是随操作系统系统位数来定。所以这个具体数值取决于操作系统位数。

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!