C语言int数据类型大小与可存储数值范围相关问题咨询
认知误区澄清
你混淆了字符形式存储的数字和二进制数值类型存储的数字的区别:
你之前认为每个数字占1字节的情况,仅适用于字符编码场景。比如ASCII编码规则里,'0'、'9'这类文本形式的数字,每个确实占1字节,存储的是字符对应的编码值(比如'1'的ASCII码是十进制的49),而非数字本身的数值。
而int这类数值类型,是将整数值直接转换为二进制串,存放在连续的内存空间里,不会把数值的每一位十进制数字拆分单独存储。
4字节int的存储容量逻辑
4字节等于32个二进制位(bit),每个bit可以表示0或1两种状态,32个bit总共可以表示2^32 = 4294967296种不同的状态组合:
- 如果是无符号
unsigned int,所有位都用来存数值,刚好对应0~4294967295的取值范围 - 如果是有符号
int,最高位用来标记正负,剩下31位存数值,因此范围是-2^31 ~ 2^31-1
你提到的200000转成二进制只有18位,远小于32位的容量,自然可以轻松存下。
C语言数据类型大小的规则依据
C语言的ISO官方标准中,没有强制规定各类型的固定字节大小,只规定了每个整数类型必须满足的最小取值范围,具体大小由编译器结合目标硬件架构决定:
char最小为1字节(8bit),必须能容纳ASCII字符集的所有编码short最小为2字节int最小为2字节,目前在绝大多数32/64位消费级硬件架构上,编译器统一将int实现为4字节,属于行业通用约定long最小为4字节,long long最小为8字节
内容的提问来源于stack exchange,提问作者Celtic Bean
相关产品推荐
相关产品推荐

