从二进制和内存的底层来探究同一数据在不同类型下的调用

引言:

在上一期博客中,我依据printf函数的打印值,推出了类似‘97’的计算方法:55+57*256=14647,但很快就有大佬为我提供了宝贵的经验和意见(在此,表示感谢),本来想在原文章上进行修改的,但考虑到篇幅及主题原因,上一篇博客主要希望大家在刚开始接触到陌生的int,char与%d,%c有更好的理解,本篇着重想帮助大家理解像int a = -20之类,在计算机内的编译及调用。

一.数(重点是负数)的二进制表示

我们都知道int包含4个字节,char包含1个字节,一个字节有8个比特位。

如73的二进制为0100 1001,其中第一个0是符号位,后7个“100 1001”是数据位。符号位0表示正数,1表示“负数”,1100 1001表示-73.但我们将100-73表示成二进制0110 0100+1100 1001时发现等于1 0010 1101,舍弃内存溢出的部分保留0010 1101=45,显然时错的。于是科学家用73的补码来表示-73.

负数的二进制表示:

73的二进制取反码(1变0,0变1),1011 0110,再加1后就是补码了1011 0111,然后回到100-73,=0110 0100+1011 0111=1 0001 1011,舍弃内存溢出的部分后0001 1011=27。

1100 1001=201,但竟然能表示负数-73,计算机的原理真神奇。。

二.准字符(像‘7m%’平常所说的错误表达)翻译成二进制数字

像字符’a'所表示的值就是其所对应的ASCII值,那像‘7m%’呢,毕竟这些程序是可以运行的。这就需要将其先翻译成二进制,再由二进制转换为十进制。翻译方式从右(个位)到左(十位),先转换为ASCII表的值(十进制再到二进制),依次写出,再翻译。7的ASCII值为55,二进制为0011 0111,m为109(0110 1101),%为37(0010 0101),合在一起就是0011 0111 0110 1101 0010 0101=3632421

 这也很好印证上一期说的一个字节的值为256,所以进制是256的观点。同时更进一步为什么进制不是128.一个字节除开符号位从0000 0000到0111 1111,能存储128个数据,对应128个ASCII码,个位由128个构成,+1就有了十位,十位存储在下一个字节当中。所以进制为256,而不是128。

比如用(An)表示ASCII值为n的字符,(A97)表示a,(A127)加1时该进位了,(A1)(A0),看似是128进制,但由于内存储存的原因,进制是256.可以以十六进制的CA来理解。

三.同一数据的不同调用

 通过以上分析以及上一篇博客,我们可以得到:

 计算机读取数据将其转换成二进制,数字通过“一”转换,字符通过“二”转换。将它赋值给char或是int类型时,其实比较相似,从左(“个位”)到右(“更高位”),只能存储内存之内的数据,超过的部分舍弃,也就是所谓的截断。%d与%c与int,char同理(抽象成模型后是等价的)。下面以昨天的六张图为例:

四,关于无符号打印的一些小发现

 

 

相信有不少初学者认为4294967276是随机值,其实不然。-20的负号是运算符(数字只能有数字或运算操作符,89i直接报错),因此对应的二进制是20的补码(1111 1111 1111 1111 1111 1111 1110 1100)=4294967276

 在这里,计算机不是先读取的0而是-,至于原因,我以后学了再补回来,二进制是这样的 20- =(0010 1101 0011 0010 0011 0000)=2961968,并将这个值赋给了a。

至此,关于c语言,刚开始学的时候可能会有的叛逆以及解释已部分解决。从这里,我们能学到什么呢?不停地问为什么,最后带来了什么,如同有数学与应用数学,学习时基础理论与具体应用,我们学c语言时要明确方向,有侧重,不知道那些数字怎么来的,其实不重要,刚开始重要的是在规则内办事,会办事,办好事,学有余力,再去思考一些底层的原理。

希望我的分享能够节约大家的时间。

 

 

 

 

  • 49
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值