Day4、进制的转换、运算符(位操作符)

来源:互联网 发布:大疆官网模拟软件p 编辑:程序博客网 时间:2024/05/17 18:44

默写:

ls 查看指定路径下的所有文件及文件夹

绝对路径指的是以根目录为起始的路径

pwd查看当前路径的绝对路径

根目录是指系统目录的起始目录

mkdir命令用来创建目录

使用方法: mkdir 目录路径

这个命令要求目录本身还不存在,但它的父目录已经存在

这个命令可以使用-p选项,这个选项可以把路径中所有不存在的目录都创建出来

 

 

把二进制所有数位从右向左每三个数位分成一组,每组用一个0-7之间的数字替换,替换的结果叫做数字的八进制表示方式

0110 1010     01 101 010 152(八进制表示)

可以在程序中采用八进制表示数字,必须以数字0开头

可以采用%o做占位符把数字的八进制表示方式显示在屏幕上

  1#include<stdio.h>

  2int main(){

 3     printf("%d  0%o",0152,0152);

 4     return 0;

  5 }              输出: 106   0152     前面变成十进制 1*64+5*8+2

把二进制所有数位从右向左每四个数位分成一组,每组用一个字符替换。这个替换结果叫做数字的十六进制。

1100 1011 = cb(十六进制)

可以在程序中使用十六进制方式表示数字,必须用0x做开头,采用%x或%X做占位符代表数字的十六进制

显示结果中不包括0x开头

用%x做占位符时,显示结果中所有字符都是小写的

用%X做占位符时,显示结果中所有字符都是大写的

  1#include<stdio.h>

  2int main(){

 3    printf("%d 0x%x0X%X",0xcb,0xcb,0xcb);

 4     return 0;

  5 }

输出结果:   203 0xcb 0XCB    (12*16+11)

C语言里采用操作符表示对数字的处理规则

根据需要配合的数字个数把操作符分成三类:单目操作符、双目操作符、三目操作符

取余:printf("15%%6is %d\n",15%6 );  前面两个%号是输出一个%,如果一个,系统以为不完整的占位符

赋值操作符(=)可以把一个数字放到一个存储区里

可以在一条语句里使用多个赋值操作符,系统先计算右边的赋值操作符,然后计算左边的

char ch=0;

int num=0;

num=ch=300;

printf(“num是%d”,num);      结果是44,因为ch=44然后复制给num

绝大多数双目操作符可以和赋值操作符合并形成复合赋值操作符,例如+=,*=等

复合赋值操作符要求左边的内容可以代表存储区,右边的内容代表数字

它首先用双目操作符对左右两边的内容做计算,然后把计算结果记录到左边的存储区里。

num=50;

num*=2+3;   num=250;

复合赋值操作符的优先级和赋值操作符的优先级一样低 (所以先算+再赋值)。

(++)(--)自增操作符和自减操作符,和存储区配合使用

它们由两种使用方法,一种是前操作符(操作符写在存储区前面),另一种是后操作符(操作符写在存储区后面)

前操作语句当作数字使用的时候是修改后的数字,后操作语句当作数字使用的时候是修改前的数字  

不要在一条语句里对同一个变量多次进行自增或自减计算,因为结果不确定。

num1=num++ + ++num;   错!!不能这样   例:

  1#include<stdio.h>

  2int main()

  3 {

 4     int num=50,num1,num2;

 5     num++;

 6    printf("%d\n",num);

 7     ++num;

 8    printf("%d\n",num);

 9     num1=num++;

 10    printf("%d\n",num1);

 11    num1=++num;

 12    printf("%d\n",num1);

 13    num=10;

 14    num1=num++ + ++num;

 15    printf("%d,%d\n",num,num1);

 16    num2=10;

 17     num1=num2++ + ++num2;

 18    printf("%d,%d\n",num2,num1);

 19    return 0;

 20 }

逻辑表达式的计算结果一定是布尔值

逻辑操作符就是用来编写逻辑表达式的

!是一个单目逻辑操作符,它可以计算一个布尔值的相反值

这个操作符应该写在一个布尔值的前面

双目逻辑操作符包括= =(等于),不等于(!=),大于(>),小于(<),大于等于(>=)和小于等于(<=)

最多包含一个双目逻辑操作符的表达式在计算机里的结果和数学里的结果一样

最多包含一个双目逻辑操作符的表达式叫做简单逻辑表达式

所有复杂逻辑表达式必须拆分多个简单逻辑表达式然后合并,这样计算机运算结果与数学结果一致

与(&&)和或(||)是双目逻辑操作符,它们用来合并多个逻辑表达式

如果两个逻辑表达式中有一个结果是假,用与(&&)合并后结果一定是假

如果两个逻辑表达式中有一个结果是真,用或(||)合并后结果一定是假

如果前面的逻辑表达式可以决定整个逻辑表达式的结果,则计算机忽略后面的逻辑表达式.

int num=0   1 | | num  printf(%d , num )    输出是 0      后面不执行

练习:男人身高减体重小于105算超重,女人身高减体重小于110算超重

编写程序从键盘得到一个人的性别,身高和体重  把超重判断的结果显示在屏幕上

       0代表女人,1代表男人,如果超重就显示1,如果不超重就显示0

思路:(超重男人)|| (超重女人)

  1#include<stdio.h>

  2int main(){

 3     intgender=0,height=0,weight=0,ret;

 4     printf("请输入性别,身高,体重: \n");

 5    scanf("%d%d%d",&gender,&height,&weight);

 6    ret=(gender&&(height-weight<105))||( ! gender&&(height-weight<110));

 7        printf("超重结果是%d",ret);

 8     return 0;

  9} 

位操作符直接操作二进制数位

~是一个单目位操作符,叫做按位求反操作符,这个操作符应该写在一个数字前面

  1 #include<stdio.h>

  2 int main(){

  3    char ch=~0xc3;

  4    int num=ch ;    隐式常量溢出

 5     printf("ch is 0x%x",num);

  6    return 0;

  7 }                  输出结果是:0x3c

1100 0011

双目位操作符包括按位与(&),按位或(|)和按位异或(^)。它们可以把两个数字对应二进制数位上的内容进行计算

按位与(&)把对应数位上的内容做与计算,只要由一个数位内容是0,则计算结果就是0.

3  0000 0011

&  5  0000 0101  

       0000 0001     3&5=1           printf("%d",3&5);     输出结果1

按位或(|)把对应数位上的内容做或计算,只要有一个数位内容是1,则计算结果就是1

3 |  5    =7              printf("%d",3|5);         输出结果7

按位异或(^)把对应数位上的内容做异或计算

如果两个数位内容一样,则异或计算结果是0,如果一样,则结果是1。

3                    0000 0011

^   5      0000 0101

           0000 0110      3^5 =6

使用功能:求一个数是否是奇数还是偶数    num & 1   计算比 num%1快

移动操作可以把一个数字中所有二进制数位的内容统一向左或向右移动n个位置

>>表示向右移动       <<表示向左移动   是双目位操作符

操作符左边的数字是将要进行移位操作的数字

操作符右边的数字是将要移动的位数

移位操作相当于把每个数位的内容放到另外一个数位,向左移动的时候右边空出来的位置上一定填充0

无符号类型向右移位后,左边空出来的位置上填充0

有符号类型向右移位后,左边空出来的位置上填充符号位  

一般情况下数字向左移动n位,相当于乘以2的n次方,向右移动n位,相当于除以2的n次方

位操作符不会修改任何存储区内容,它们只是计算出一个新数字

&可以作为单目操作符使用,也可以用来计算一个存储区的地址

在计算机中所有地址数据都是32个二进制数位(即8个16进制)

  1 #include<stdio.h>

  2 int main(){

  3     int num=0;

  4     printf("&num的地址是 %p",&num);

  5     return 0 ;

  6 }          输出为:  0xbfe88abc

*也可以当单目操作符使用,这个时候它可以根据一个地址找到相应的存储区,此时*应该写在一个地址数据前面

*(&num)=10;   将num地址的存储区赋值10

(用&算出num的地址,用*找到地址,写入10)

三目操作符从两套不同的计算规则中选择一套进行计算

布尔值?公式一:公式二

如果布尔值是真,就采用公式一进行计算,否则采用公式二计算

例:计算绝对值

  1 #include<stdio.h>

  2 int main(){

  3     int num=0;

  4     printf("请输入一个数字: ");

  5     scanf("%d",&num);

  6     num=num>=0?num:0-num;

  7     printf("绝对值是%d\n",num);

  8     return 0;

  9 }

不要写成num>=0 ? num=num : num=0-num ;  不能在问号后使用赋值操作符 

作业:使用三目表达式重新实现超重练习

男人身高减体重小于105算超重,女人身高减体重小于110算超重

编写程序从键盘得到一个人的性别,身高和体重  把超重判断的结果显示在屏幕上

        0代表女人,1代表男人,如果超重就显示1,如果不超重就显示0

  1#include<stdio.h>

  2 intmain(){

  3     int gender,weight,lenth,ret;

  4     printf("请输入性别 体重 身高");

  5    scanf("%d%d%d",&gender,&weight,&lenth);

  6    //ret=(gender&&(lenth-height<105)||(!gender)&&(lenth-height<110))?1:0;

  7    ret=gender?lenth-weight<105:lenth-weight<110

  8     printf("显示结果是%d\n",ret);

  9     return 0;

 10 }

如果表达式里多个数字不是同一类型,则计算机无法完成表达式的计算

这个时候计算机需要首先把所有数字转换成同一个类型,这个转换过程由计算机完成,叫做隐式类型转换

隐式类型转换中一定把占用内存空间小的类型转换成占用内存空间大的类型

sizeof ( 1 ? 1 : 0.9 )    是 8      首先转换成双精度

如果不同类型占用内存空间大小一样,就把整数类型转换成浮点类型,把有符号类型转换成无符号类型

Printf (“%d”,-7+3>0)      输出结果为  0

Printf (“%d”,-7+3u>0)      输出结果为  1

Printf (“%u”,-7+3u>0)      输出结果为  1

C语言可以随时给数字指定一个类型,这叫做强制类型转换

强制类型转换格式如下:

(char)300

Printf(“%d”,(char)300 );   输出结果是44  

原因: 300是整型,强制转换成字符类型,前面3个字节丢失,只剩最后一个字节内容

强制类型转换有可能导致数据丢失

类型转换不会修改任何存储区内容,计算机会用一个新的存储区记录转换后的数字。

作业:编写程序从键盘得到一个0到127之间的整数,把它转换成二进制,并把结果显示在屏幕上(先显示左边数位,后显示右边数位)

  1 #include<stdio.h>

  2 int main(){

  3     unsigned int num=0;

  4     printf("请输入一个0-127的数字: ");

  5     scanf("%d",&num);

  6    printf("%d",(num&128)>>7);

  7    printf("%d",(num&64)>>6);

  8    printf("%d",(num&32)>>5);

  9    printf("%d",(num&16)>>4);

 10    printf("%d",(num&8)>>3);

 11     printf("%d",(num&4)>>2);

 12    printf("%d",(num&2)>>1);

 13     printf("%d\n",num&1);

 14     return 0;

 15 }

16 #include<stdio.h>

 17 int main(){

 18     int num=0;

 19

 20     printf("请输入一个0-127的数字: ");

 21     scanf("%d",&num);

 22     printf("%d",(num&128)!=0);

 23     printf("%d",(num&64)!=0);

 24     printf("%d",(num&32)!=0);

 25     printf("%d",(num&16)!=0);

 26     printf("%d",(num&8)!=0);

 27     printf("%d",(num&4)!=0);

 28     printf("%d",(num&2)!=0);

 29     printf("%d\n",num&1);

 30     return 0;

 31 }

可以用16进制替换128、64、32…..

128=0x80  64=0x40  ….

0 0
原创粉丝点击