第三章注解与习题

1.进制
C语言中字符可以直接用ASCII码表示,eg:\012就是八进制表示换行符
代码如下:

点击查看代码
  #include<stdio.h>
  int main()
  {
  	putchar('a');
  	putchar('\012');
  	putchar('a');
  	putchar('\xa');
  	putchar('a');
  	return 0; 
  }

上述的代码证明了上述的结论,同时说明了十六进制与八进制是如何表示具体的字符的。注意:使用十六进制的时候前面需要添加x来表示自己是十六进制,否则编译器无法识别,同时x必须是小写的而后面的a可以大写也可以小写。

2.移位运算符
移位运算符涉及到数据在系统中的存储结构,是以二进制存储。同时需要关注移位运算符的运算优先级。
需要理解为什么<<1相当于乘以2,是因为二进制转化为十进制的时候的方法
二进制数abc转化成十进制数的时候的方法是
(a * 2 + b) * 2 + c
因此这个二进制数如果整体往左移动一位,那么就成了abc0
也就是((a * 2 + b) * 2 + c) * 2 + 0
因为最后一位是0不会对其造成影响,因此左移动一位相当于直接乘以2,当然注意是需要在数据存储范围内的合法移动,否则运算结果会出错
理解了上述的结论,就会发现如果>>1就相当于整数的除以2,也就是这个数除以2后向下取整
eg: 8 >> 1 == 4;
7 >> 1 == 3;
注意移位运算符的运算级别没有加法减法高因此注意括号的使用

点击查看代码
#include<stdio.h>

int main()
{
	int i = 2;
	i = i << 1 + 1;
	printf("%d\n", i);
	return 0;
}

这边的输出结果是8而不是5

3.补码表示法
原码,反码,补码
符号位加绝对值的缺点:没法简便的直接进行计算,而采用补码的表示方法可以直接进行计算,同时对于0的存储类型会出现两种情况+0,-0,而这在补码的表示方法中并不会出现,原因如下:
原码:就是上述所说的符号位加上绝对值的表示方法,其中符号位0表示正数,1表示负数
eg:00000001:1
10000001:-1
反码:
对于正数其反码与原来相同,而负数除了符号位不变,其他各位取反
eg:00000001:1
11111110:-1
补码:
对于正数其补码与原码相同,而负数在反码的基础上+1就是补码了
eg:00000001:1
11111111:-1
这样子1+(-1)
就是
00000001
+11111111
=00000000
注意这边就是最高位的进位扔掉就可以了
现在讲述为什么补码没有正零和负零的区别:
原码:
00000000:+0
10000000:-0
反码:
00000000:+0
11111111:-0
补码:
00000000:+0
00000000:-0
为什么补码可以实现如此强大的计算功能,笔者也没弄懂,待后面学习后再来补充。
假定现在通过三位来表示数字大小,其范围是-4~3,原因如下:
很明显正数最大的表示方法就是:011 == 3
而负数本来最大的表示方法是:111-->100-->101==-3,但是因为0只有一种表示方法000,导致100空闲,而为了不浪费,因此规定100为-4,注意二进制中最小值是111,但是再二进制补码中最小值是100,就是为了空间的最大利用率

posted @   banyanrong  阅读(116)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示