程序数据的表示
开头王炸:
解决和解释上述问题是本次博客的主要目的
《从机器语言到高级语言》
可以看到:
机器语言极其不灵活,一旦要在事后做出一些改变就会导致重头再来
汇编语言的到来确实更好一点
但是我们需要将汇编语言翻译成机器语言了
《计算机体系层次》
《模运算系统和补码表示》
从其中我们可以得到一下几个规律:
1.对于负数的补码 = mod+负数 = 各个位取反,最后+1
2.对于正数的补码 = -(正数-mod)
= 正数本身
比如如何知道-8的补码是1000?
2^4-1000=1000得来
其余同理
现在基本上所有带符号整数都用补码表示
如果一个int 的数据已经到了其可以表示的最大正数 2^31-1
如果这个时候再对其+1
则根据上面的圆盘图可以知道,其应该变成int 可以表示的最大负数 -2^31
《无符号数与带符号数》
在c语言中如图
红色渲染的地方都是无符号整数类型
其余为有符号整数类型
注意指针由于其保存的是一个地址,所以其也是无符号整数类型
即无符号整数比有符号整数表示的范围更大
像double与int运算时,编译器会自动将int转化为double
同理当无符号整数与有符号整数进行比较
最后是按照无符号整数的规则进行比较
以-1<0 与 -1<0 U进行说明
-1<0 两个都是带符号数,比较时
首先将-1 和 0转化为二进制数(补码表示的)
-1 为 11....1111
0 为 000....00
这里按照带符号数比较时,因为最高位为符号位
所以容易知道-1<0
但是 -1 < 0U
这里 -1是带符号数,0是无符号数
首先将数据转化为二进制数
-1 为 11....111
0 为 00...00
比较规则是无符号整数比较
则判断-1>0
再看这个:
2147483647 = 2^31 -1
即为0111......1
-2147483647-1 = -2^31
在补码下为 100....000
这里按照无符号整数进行比较,认为
2147483647U < -2147483647-1
为何?
因为int (32位 )最大表示正整数为2^31-1 = 2147483647
这里2147483648 = 2^31
想象一下上面的圆盘,最大数+1后变最小数
在补码表示下 2147483648 为 1000....0000
而在int 下 1000....0000 表示 -2147483648
《非数值数据的表示》
非数值数据大致可以分为
逻辑数据的编码
西文字符的编码
汉字的编码
多媒体数据的编码
所谓靠指令来识别即看指令数 如add等运算操作,还是>> 等逻辑操作
如果是运算操作,则数据被当成数值数据运算
输入码就是如我们经常使用的拼音等
内码是系统中对汉字进行二进制转化的表(如同西文字符的Ascii码表)
本文作者:次林梦叶
本文链接:https://www.cnblogs.com/cilinmengye/p/17337950.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-04-20 二分,但是十分不明显,但是对于数很大,存储空间很大,用二分找数值确实很快
2022-04-20 树的dfs遍历----但是输入很特殊,单单靠输入形成不了树