二进制
大约 2 分钟
二进制
整数A和B如何通过移位运算判定大小
// 通过符号位
func compare(a, b int) string {
c := a - b
z := (unsafe.Sizeof(c)-1)*8 + 7
d := c >> z
l := []string{"b大", "a大"}
return l[d+1]
}
int32最大值和最小值分别用二进制表示
# 二进制 110 转十进制
# 任何数的0次方都是1也就是说 2^0 = 1
0*2^0 + 1*2^1 + 1*2^2 = 6
# int8表示 8bit 最左边是符号位那么最大就是
01111111
# 转十进制就是
1*2^0 + 1*2^1 + 1*2^2 ... + 1*2^6 + 0*2^7 = 127
# uint8 没有符号位那么最大就是
11111111
1*2^0 + ... + 1*2^7 = 255
# int32的最大值为最高位为0,其余位都为1的二进制数,2^31 - 1,即2147483647
$ 01111111 11111111 11111111 11111111
2^30 + 2^29 + 2^28 + ... + 2^3 + 2^2 + 2^1 + 2^0
# 最小值为最高位为1,其余位都为0的二进制数
# 最小值为最高位为1,其余位都为0的二进制数
$ 10000000 0000000 00000000 000000000
# 第一位1既是符号位,也是数值位:−2^31=2,147,483,648
$ 10000000 00000000 00000000 00000000
最大值加1位溢出变最小值
int是一种整数数据类型,在大多数编程语言中,它通常由32位(4个字节)来表示。根据二进制补码表示法,int的最大值是带符号的2^31 - 1,即2147483647。当我们尝试将最大值加1时,会导致溢出,即超出int数据类型所能表示的范围。溢出后,int会循环回到最小值,即-2147483648。这是因为计算机使用有限位数来表示整数,超出这个范围的值无法正确表示。溢出是一种常见的错误,可能导致程序产生意想不到的结果。
计算二进制的最大值
# int32
2 ^ 32 -1
# int8
2 ^ 8 -1
二进制转换十进制
# 二进制转为十进制要从右到左用二进制的每个数去乘以2的相应次方
# 最高位为符号位,其余位表示数值部分
# 所以下面符号位为0 表示正数
# 0111111 11111111 11111111 111111111
(1 * 2^0) + (1 * 2^1) + (1 * 2^2) + ... + (1 * 2^30) + (0 * 2^31) = 2147483647
# 符号位为负数
# 第一位为1代表负数,其余31位表示数值部分
# 二进制 10000000 00000000 00000000 00010111
# 二进制转换
$ 0 0 1 0 1 0 1 0
$ 0*2^7 0*2^6 1*2^5 0*2^4 1*2^3 0*2^2 1*2^1 0*2^0
二进制 10000000 00000000 00000000 00000001 的值十进制是多少
不是 -1
https://zhuanlan.zhihu.com/p/75291280https://www.cnblogs.com/MinPage/p/14206580.html