int / uint 的 取值范围、二进制表示形式、与十进制转换方法

本文详细介绍了整型数据类型如int8、uint8等在内存中的存储方式以及取值范围。通过二进制表示法,展示了正负数的转换,并解释了符号位如何影响数值范围。此外,还探讨了无符号整型的最大值计算。内容涵盖了二进制与十进制之间的转换方法,以及负数的原码、反码和补码表示。
摘要由CSDN通过智能技术生成

int / uint 类型 的取值范围:

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

uint8:  0 ~ 255
uint16: 0 ~ 65535
uint32: 0 ~ 4294967295
uint64: 0 ~ 18446744073709551615

包含 int / uint 在内所有类型的数据都是以二进制形式存储在内存中,所以先了解下内存的单位与进制,如下:

1TB = 1024GB
1GB = 1024MB
1MB = 1024KB
1KB = 1024Byte
1Byte = 8Bit

Byte 又称为 字节,Bit 又称为 位,Bit 是内存中最小的单位

int后数字代表该类型在内存中所占位数(Bit),根据上述的内存单位进制可知: 

int8 / uint8:占8Bit = 占1Byte = 在内存中二进制表现形式为:00000000 00000000

int16 / uint16:占16Bit = 占2Byte = 在内存中二进制表现形式为:00000000 00000000 00000000 00000000

int32 / uint32:占32Bit = 占4Byte = 在内存中二进制表现形式为:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

int64 / uint64:占64Bit = 占8Byte = 在内存中二进制表现形式为:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 十进制与二进制的转换

正数的互转:

十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

 如图所示,29的二进制数为:00011101

换算成10进制为 从低位到高位开始计算:

0        0        0        1        1        1        0        1
0*2^7    +0*2^6   +0*2^5   +1*2^4   +1*2^3   +1*2^2   +0*2^1   +1*2^0
0        +0       +0       +16      +8       +4       +0       +1
=29

负数的互转:

如果需要转换负数,需要先了解下负数的二进制表达形式:
        负数以其绝对值的补码形式表达。 需要先获得其绝对值的原码,再得反码,再得补码。
        原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
        反码:将二进制数按位取反(1变0,0变1),所得的新二进制数称为原二进制数的反码。
        补码:反码加1称为补码。

所以-29的二进制为:
绝对值:29
原码:00011101
反码:11100010
补码:11100010  +  00000001
表达:11100011

想要反推出负数的十进制,只需要按同样的方法将表达反推原码,原码的十进制数 * -1 即可:

所以-29的原码二进制为:
表达:11100011
反码:00011100
补码:00011100  +  00000001
原码:00011101
换算成10进制为 从低位到高位开始计算:

0        0        0        1        1        1        0        1
0*2^7    +0*2^6   +0*2^5   +1*2^4   +1*2^3   +1*2^2   +0*2^1   +1*2^0
0        +0       +0       +16      +8       +4       +0       +1
=29* -1
= -29

int / uint 类型 的取值范围详解(二进制到十进制),以 int8 / uint8 为例:

int8占1个字节,1字节(byte)占8位(bit)
 
其中最高位代表符号位 1-负号;0-正号
 
那么最大数值(127)的二进制为:
0 1 1 1 1 1 1 1

换算成10进制为 从低位到高位开始计算:

0        1        1        1        1        1        1        1
0*2^7    +1*2^6   +1*2^5   +1*2^4   +1*2^3   +1*2^2   +1*02^1   +1*2^0
0        +64       +32     +16      +8       +4       +2       +1
=127

那么最小数值(-128)的二进制为:
1 0 0 0 0 0 0 0 

-128的原码二进制为:
表达:10000000
反码:01111111
补码:01111111  +  00000001
原码:10000000
换算成10进制为 从低位到高位开始计算:

1        0        0        0        0        0        0        0
1*2^7    +0*2^6   +0*2^5   +0*2^4   +0*2^3   +0*2^2   +0*02^1  +0*2^0
128      +0       +0       +0       +0       +0       +0       +0
= 128 * -1
= -128

更好理解的解释:
1.int8占1个字节(Byte) 也就是8个二进制位(Bit)
2.每个二进制位 可以存储0 和 1 两个数 ,8个二进制位就有2^8 = 256种组合(可以存储256个数)
3.int8为有符号,所以正数和负数将平分256个数。256 / 2 = 128
4.负数为128个数 最小值为-128 
5.正数为128个数,0占一个数 最大值为+127
 
如果是uint8(8Bit无符号-没有负数) 2^8 = 256
0 占一个数 ,所以最大是255

其他位int / uint计算方法与int8 / uint8相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值