C-学习笔记1-补码、运算符、类型转换

    鉴于已经有Python和Java的语言基础,重复的细节不再赘述,只记录学习中遇到的重点和难点。

    1.整型数据在内存中的存储形式

          对于正数,其原码是其二进制形式,第一位为0(代表正数),补码与原码相同,反码与原码相同。

         对于负数,其原码是其二进制形式,第一位为1(代表负数),反码除第一位符号为不变,其余位将0变为1,1变为0,补码为反码加1。

          补码为整型数在内存中存储的形式。

    2.实型数据的指数表达

         其格式为aen,表示 a\times 10^{n}

         例如12.3e2 表示 12.3 \times 10^{2} ,78e2表示 78 \times 10^{2}

         实型常量都是双精度,如果要指定它为单精度,可以加后缀f。

   3. 实型数据在内存中的存放格式

         一个float实型数据一般在内存中占四个字节。与整数存储方式不同,实型数据是按照指数形式存储的。

扫描二维码关注公众号,回复: 3581324 查看本文章

        

 4. 字符数组

        C语言规定以"\0"作为字符串结束的标志,所以CHINA的长度为6。

        C语言没有专门的字符串变量,如果想讲一个字符串存放在变量中,可以使用字符数组。

        字符串""长度为1。

5. 运算符及其表达式

        a.在C语言中,凡是表达式可以出现的地方均可出现赋值表达式:

            x = (a=5) + (b=3);

        b.条件运算符及其表达式

           条件运算符为"?"和":",它是一个三目运算符,即有三个参与运算的量。一般为:

               表达式1?表达式2:表达式3

           表示判断表达式1的真值,若表达式1为真,则表达式为表达式2的值;反之,若表达式1为假,则表达式为3的值。

           条件表达式通常用在赋值语句中,例如:

                  if(a>b)   max=a;

                  else max=b;

           可以写为:

                  max=(a>b)?a:b;

           条件运算符的结合方向为从右到左,例如:

                  a>b?a:c>d?c:d;

           应理解为:  a>b?a:(c>d?c:d);

      c.位运算符及其表达式

            (1).按位与运算 

                运算符"&"的功能是对参与运算的两数各对应的二进位相与。只有对应的两个二进位与为1时,结果位才为1,否则为0。参与运算的数以补码的方式出现:

                例如9&5可写算式如下:

                       00001001    (9)

                  &   00000101    (5)

                       00000001     (1)

                所以9&5=1

               按位与运算通常用来对某些位清0或者保留某些位。例如把a的高八位清0,保留低八位,可让a与255作按位与运算

               (255的二进制数为0000000011111111)。     

         (2).按位或运算

               按位或运算符"|"的功能是对参与运算的两数各对应的二进位相或。只要对应的两个二进位有一个1时,结果位就是1。参与运算的两个数均以补码出现。

                例如9|5的计算如下:

                         00001001     (9)

                    |    00000101     (5)

                         00001101     (13)

                所以9|5=13

         (3). 按位异或运算

                按位异或运算符"^"的功能是对参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下:

                        00001001      (9)

                   ^   00000101      (5)

                        00001100      (12)

                  所以9^5=12

         (4).按位取反运算

                  按位取反运算符"~"的功能是对参与运算的数的个二进位按位求反。

                  例如~9的运算为:

                        ~(00001001),结果为:11110110。

         (5).左移运算

              左移运算符"<<"的功能是把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。

                 例如:a<<4

                 指把a的各二进制向左移动4位。如a=11000011(十进制195),左移四位后为00110000(十进制48)。注意,a的值并没有变。

          (6).右移运算

                 右移运算符">>"的功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数制定移动的位数,低位丢弃,高位补0或补1。

                  例如:a>>2

                  指把a的各二进制向右移动两位。如a=000001111(十进制15),右移两位后为000000011(十进制3)。

                  应当说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。很多系统规定为补1。

6.自动转换与强制转换

          整型和实型数据可以混合运算,另外字符型数据和整形数据可以通用,因此不同数据类型之间可以混合运算。

          例如:表达式10 + 'a' + 1.5 - 8765.1234 * 'b'是合法的。

         a.自动转换时数据按长度增加的方向进行,例如int转换为long型最计算,float转换为double计算,char转换为int,最终得到一个double的结果。

          赋值运算时右边的类型会转换为左边的类型,若左边的类型数据长度比右边短,则将丢失一部分数据,丢失的部分四舍五入向前舍入,这样会降低精度,这样是截断型的转换。

         b.强制类型转换

             (int)a 把a强制转换为整型量

             (float)a 把a强制转换为实型

             (float)(x+y) 把x+y的和转换为实型

             (float)a+b 先把a转换为实型,在与b相加

            无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。

             

猜你喜欢

转载自blog.csdn.net/Kayaobi/article/details/82590455
今日推荐