您的位置:首页 > 编程语言 > C语言/C++

嵌入式学习之路(十)——C语言学习(5)

2013-12-14 20:00 267 查看
嵌入式学习之路(十)——C语言学习(5)

接下来我们来讲讲负数的二进制怎么表示呢?
1.我们知道一个字节只有8位,所以我们规定1 0000 0000等于0,那么1 0000 0000 - 正数 = 是不是就是负数了呢,所以我们就得到了负数的求法:
负数 = 1 0000 0000 - 正数 => 负数 = 1111 1111 + 1 - 正数,因为是1111 1111 ,1-1 = 0,1 - 0 = 1,所以相当于对正数取反,所以负数就可以 在正数的基础上取反加一。我们来举个例子
-5 = 5 = 0000 0101 取反=> 1111 1010 + 1 => 1111 1011,所以-5就 = 1111 1011 ,很多同学就会问了,那么1111 1011也可以表示正数啊,怎么区分呢?
若该数是有符号的,那么他的最高位就代表符号位,0表示正数,1表示负数。
若该数是无符号的,那么他肯定是正的啦!
2.细心的同学肯定会发现,我们之前的-191为什么会打印出'A'了,我们来算一下;
-191 => 191的二进制为 1011 1111,将其取反加一 => 0100 0001 = 65 是不是就是'A'呢,可能笔试会碰到哦!(其实我也不知道对不对,应该是这么算的吧)
3.有符号整数类型在扩展时会在前面填充数字的符号位,无符号前面补0,整数类型之间互相赋值时会保持二进制不变,就有可能造成数位的丢失
4.接下来我们来讲讲C语言中的操作符把,

先讲讲特别会被我们遗忘的操作符吧:

  1.‘,’逗号操作符,可以把多个表达式连接在一起成为一个表达式,其中表达式的计算结果是其中最后一个表达式的计算结果,它的运算优先级非常低
  2."="叫做赋值操作符,一条语句中如果有多个赋值操作符则先执行右边的然后执行左边的 num = num1 =20
  3.大多数双目操作符都可以和赋值操作符合并形成复合赋值操作符例如:*=,/=,+=,-=,复合赋值操作符可以对变量中的数据进行处理并记录在原有变量中,复合赋值操作符的优先级和赋值操作符一样
  4.自增操作符++和自减操作符(--)可以对变量中的数字做加一或减一操作,这两个操作符都需要和一个变量配合使用a++,a--,--a,++a。这两个操作符都有前操作和后操作之分,前操作符的优先级非常高,后操作符的优先级非常低

  5.逻辑操作符:在讲逻辑表达式之前先将一下,计算机中的bool类型的变量:布尔bool类型包含真和假,true和false两个数值,需要包含stdbool.h头文件,在计算机里真用1表示,假用0表示。C语言中所有整数都可以当作布尔数值使用,整数0当作布尔值使用时表示假,其他整数当作布尔值使用时表示真。

我们用逻辑操作符编写的逻辑表达式的计算结果只能是真或者是假,双目逻辑操作符包括 "==" ,!=,>,>=,<和<=,"!"单目逻辑操作符,表示对一个布尔逻辑值求反,非真即假,非假即真。
 6.复杂逻辑表达式:由两件或两件以上的表达式组成的表达式为复杂表达式,&&(与)和||(或)这两个逻辑操作符可以用来编写复杂逻辑表达式

使用&&合并的两个简单逻辑表达式都为真的时候,复杂逻辑表达式的结果为真

使用||合并的两个简单逻辑表达式,其中有一个为真,则复杂表达式结果为真
&&和||都具有短路特征:如果根据前面的简单表达式就可以判断整个复杂表达式的结果则后面的简单表达式就不计算了。

 7.接下来来介绍我们的位运算操作符,位运算操作符的话,比起其他运算,他的效率会比较高,因为它直接对位进行操作,其他操作符都要先转换为位操作。我可以举个例子。
我们笔试经常会遇到这样一个问题,要求你不使用其他变量,交换两个数的值。
通常我们会这样做。a = a + b; b = a - b;a = a - b;现在我告诉你可以这样做:
 a = a ^ b; b = a ^ b;a = a ^ b;结果可不可以实现呢,大家自己去试吧。下次为大家讲解为什么吧,哈哈,留个悬念!


 8.按位与计算时对应数位上只要有一个零则这个数位的计算结果就是零 3 & 5 = 1
    按位或结算时对应数位上只要有一个一则这个数位的计算结果就是一 3 | 5 = 7
    按位异或计算时,两个不一样时,结果为一,一样时,结果为零     3 ^ 5 = 6
    任何数位和0做按位与结果为0

    任何数位和1做按位与结果不变

    任何数位和0做按位或结果不变

    任何数位和1做按位或结果是1
    任何数位和0做按位异或结果不变    任何数位和1做按位异或结果取反    位运算的使用时候,通常是知道结果的
  9.下面还有移位操作符:
    左移使用<<表示,右移使用>>表示,符号左边是要操作的数据,右边是移动位数,移位操作不会改变参与计算的数字

如果一个数字向左移动,右边的空位置上一定补0,有符号数据右移的时候左边的空位置上补符号位

    如果移位操作工程中没有丢失有效数据
ac53
则左移n位相当于乘以2的n次方,右移n位相当于除以2的n次方

  10.'~'是单目位操作符,可以对二进制数位进行按位求反

    '&'取地址符号,可以用来获得一个变量存储位置的地址
    '*'可以根据存储位置的地址
  11.三目运算符:三目运算符格式如下:
1.布尔值  ? 公式一 ? 公式二 
如果布尔值是真,则采用公式一,否则采用公式二

    三目表达式的计算结果就是最终采用的计算公式的计算结果
5.隐式类型转换:如果一个表达式中的多个数据类型不同则计算机会首先把他们转换成相同的的类型然后再进行计算,这个转换过程叫做隐式类型转换,由计算机自动完成
  为了避免转换过程中的数据丢失,计算机会把占地小的数据转换成占地大的数据
  如果数据类型不同,占地一样大,则按照整数转浮点数,有符号转无符号的规则

  类型转换的实现过程中会制作出新的符合要求的变量,然后用旧数据对新变量进行赋值,最后用新变量进行赋值。

6.强制类型转换:类型转换的实现过程中会制作出新的符合要求的变量,然后用旧数据对新变量进行赋值,最后用新变量进行赋值可以在程序中强制对数据进行类型转换

在一个数据前边加上小括号,并在小括号里写一个类型名称,就可以实现强制类型转换

(char)10就是一个强制类型转换的例子强制类型转换有可能造成有效数据丢失
我们学的知识也差不多了,已经可以开始谢谢程序啦,我们可以来谢谢几个经典的简单程序啦!
哈哈,今天就到这里啦!明天我们来复习一下分支语句和循环吧!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 嵌入式 ubuntu