还不清楚字符型数据在内存中的存储吗?来看这里包教你会!

通鞋们,今天我向大家分享字符型数据和整形数据在内存中时如何存储的,大家系好安全带,准备发车咯。

首先对于字符型数据,也就是char型数据,它其实是和整形数据的存储很相似,因为char类型的数据和Int类型的数据是可以相互转化的(就比如可以将字母转化为其对应的ASCII码)它的类型分为两类其一是有符号(signed char)、其二是无符号的(unsigned char)。

初学者学到char 类型时都知道 char类型在内存存储中只占1个字节,也就是8个比特位。那么对于signed char(大多时候都已char表示)来说,既然对于给我的内存空间只有8个比特位 而且我自身还是带有符号的,所以为了将这8个比特位合理利用起来,就分为两个部分来存储,即符号位和数值位。在计算机存储中对于带有符号的数进行存储时,符号位的存储一般都是用一个比特位来存储即可而且都是利用二进制的最高位来存储,最高位为0表示该数为正数,最高位为1表示该数为负数。然后剩余的7个比特位就用来存储这个char类型数的大小。

而对于unsigned char 来说,所谓无符号我的理解就是没有符号位这一回事,也就是它的8个比特位全用来存储数值大小了。

我们都知道signed char 类型的范围是 -128~127,unsigned char类型的范围是0~255。结合我上面所说的,我想童鞋你应该知道它们各自的取值范围是怎么得来的了吧。其实理解他们的存储范围还有一个更简单的方法,对有符号的char来说,从1(0000 0001)到127(0111 1111)每次都加1,等127(0111 1111)加1 后就变成了(1000 0000)这是个负数,他的补码为(1 0000 0000)关于这里我不知道它的-128是怎么计算出来的,我查询后得到的结果说这里是一个规定啥的,我不确定,如果童鞋们有知道的可以给俺分享一下哈)继续从-128(1000 0000)加1得到(1000 0001)经过求补码得到的结果为(1111 1111)除去最高位的数值位1 其余位加起来刚好是127,所以该二进制数就是-127,依次类推每次在上一个的原码基础上加上1得到的结果是-126、-125......-1

-1(1111 1111)求补码为(1000 0001)在其原码的基础上加1得到(1 0000 0000)这里有9个比特位去掉最高位恰好是(0000 0000)这就是0这样观察下来这好像就是一个循环啊。除了那个特别的位置,其他的数在其原码的基础上加一得到的结果都是有规律的(注:计算机中存储的都是补码)。

同样unsigned char类型和整形数据的存储都符合这个规律,把带符号的数和不带符号得数分开计算。最终结果都类似一个圆一样,这也是有这些取值范围的原因。

这里分享一段代码供童鞋们参考:

int main()
{
	//有符号
	signed char num1 = 127;
	signed char num2 = 130;
	//无符号
	unsigned char num3 = 255;
	unsigned char num4 = 257;
	printf("%d\n", num1);
	printf("%d\n", num2);
	printf("%d\n", num3);
	printf("%d\n", num4);
	
	//结果分别为:127、-126、255、1


	return 0;
}

好了,今天就分享这些,可能有点啰嗦了但本意都是希望对童鞋们有益。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值