C语言,day04

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

0110 1010 01 101 010 152(八进制)

可以在程序中采用八进制方式表示数字,必须以数字0做开头
可以采用%o做占位符把数字的八进制表示方式显示在屏幕上

把二进制所有数位从右向左每四个数位分成一组,每组用一个字符替换。这个替换结果叫数字的十六进制表示方式。
(用a到f这六个英文字母替换10到15之间的数字)

1100 1011 cb(十六进制)

可以在程序中直接使用十六进制方式表示数字,这个时候必须用0x做开头
可以采用%x或%X做占位符把数字的十六进制表示方式显示在屏幕上
显示结果中不包含0x开头
用%x做占位符的时候显示结果中所有字符都是小写的
用%X做占位符的时候显示结果中所有字符都是大写的

/*
八进制和十六进制演示
*/
#include <stdio.h>
int main() {
printf("%d   0%o\n", 0152, 0152);
printf("%d   0x%x   0X%X\n", 0xcb, 0xcb, 0xcb);
return 0;
}

C语言里采用操作符表示对数字的处理规则
根据需要配合的数字个数把操作符分成三类,分别是单目操作符,双目操作符和三目操作符

如果参与除法计算的两个数字都是整数则计算结果只保留整数部分

%也是一个操作符,它表示取余操作

赋值操作符(=)可以把一个数字放到一个存储区里
赋值语句可以当作数字使用,这个数字就是赋值完成后存储区里的数字
可以在一条语句里使用多个赋值操作符,这个时候先计算右边的赋值操作符后计算左边的

绝大多数双目操作符可以和赋值操作符合并形成复合赋值操作符,例如+=,*=等
复合赋值操作符要求左边的内容可以代表存储区,右边的内容可以代表数字
它首先用双目操作符对左右两边的内容做计算,然后把计算结果记录到左边的存储区里
复合赋值操作符的优先级和赋值操作符的优先级一样低

自增操作符(++)和自减操作符(–)都是单目操作符
它们都应该和存储区配合使用
它们可以把存储区里的内容加一或者减一
它们各有两种使用方法,一种是前操作(操作符写在存储区前面),另外一种是后操作(操作符写在存储区后面)
前操作语句当作数字使用的时候是修改后的数字,后操作语句当作数字使用的时候是修改前的数字
不要在一条语句里对同一个变量多次进行自增或自减计算,因为结果不确定

/*
    操作符演示
*/
#include <stdio.h>
int num2;
int main() {
    char ch = 0;
    int num = 0, num1 = 0;
    printf("15 %% 6是%d\n", 15 % 6);
    num = ch = 300;
    printf("num是%d\n", num);
    num += 6;
    printf("num是%d\n", num);
    num *= 2 + 3;
    printf("num是%d\n", num);
    num++;
    printf("num是%d\n", num);
    ++num;
    printf("num是%d\n", num);
    num = 10;
    num1 = num++;
    printf("num是%d,num1是%d\n", num, num1);
    num1 = ++num;
    printf("num是%d,num1是%d\n", num, num1);
    num = 10;
    num1 = num++ + ++num;
    printf("num是%d,num1是%d\n", num, num1);
    num2 = 10;
    num1 = num2++ + ++num2;
    printf("num2是%d,num1是%d\n", num2, num1);
    return 0;
}

逻辑表达式的计算结果一定是布尔值
逻辑操作符就是用来编写逻辑表达式的

!是一个单目逻辑操作符,它可以计算一个布尔值的相反值
这个操作符应该写在一个布尔值的前面

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

最多包含一个双目逻辑操作符的表达式在计算机里的结果和数学里的结果一定一样
可以把最多包含一个双目逻辑操作符的表达式叫做简单逻辑表达式
所有逻辑表达式必须拆分成多个简单逻辑表达式然后再合并

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

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

与(&&)和或(||)都具有短路特征
如果前面的逻辑表达式可以决定整个逻辑表达式的结果则计算机忽略后面的逻辑表达式

/*
    逻辑操作符演示
*/
#include <stdio.h>
int main() {
    int num = 0;
    printf("!8是%d\n", !8);
    printf("3 < 7 < 5是%d\n", 3 < 7 < 5);
    printf("3 < 7 && 7 < 5是%d\n", 3 < 7 && 7 < 5);
    1 || ++num;
    printf("num是%d\n", num);
    0 && ++num;
    printf("num是%d\n", num);
    return 0;
}

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

/*
    逻辑表达式练习
*/
#include <stdio.h>
int main() {
    int gender = 0, height = 0, weight = 0, ret = 0;
    printf("请输入性别,身高和体重:");
    scanf("%d%d%d", &gender, &height, &weight);
    ret = (gender && (height - weight < 105)) || (!gender && (height - weight < 110));
    printf("超重结果是%d\n", ret);
    return 0;
}

~是一个单目位操作符,这个操作符可以根据一个数字计算出另外一个数字。这两个数字在所有二进制数位上的内容都不一样。
~叫做按位求反操作符
这个操作符应该写在一个数字前面

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

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

3 0000 0011
& 5 0000 0101
0000 0001

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

3 0000 0011
| 5 0000 0101
0000 0111

按位异或(^)可以把对应数位上的内容做异或计算
如果两个数位内容一样则异或计算结果是0否则结果是1

3 0000 0011
^ 5 0000 0101
0000 0110

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

/*
    位操作符演示
*/
#include <stdio.h>
int main() {
    char ch = ~0xc3;
    int num = ch;
    printf("ch是0x%x\n", num);
    printf("3 & 5是%d\n", 3 & 5);
    printf("3 | 5是%d\n", 3 | 5);
    printf("3 ^ 5是%d\n", 3 ^ 5);
    printf("3 << 2是%d\n", 3 << 2);
    num = 0x80000000;
    printf("num >> 2是0x%x\n", num >> 2);
    printf("0x80000000 >> 2是0x%x\n", 0x80000000 >> 2);
    return 0;
}

<< 表示向左移动 ,>> 表示向右移动
它们都是双目位操作符
操作符左边的数字是将要进行移位操作的数字
操作符右边的数字是将要移动的位数
移位操作相当于把每个数位里的内容放到另外一个数位里

向左移动的时候右边空出来的位置上一定填充0
无符号类型数字向右移位后左边空出来的位置上一定填充0
有符号类型数字向右移位后左边空出来的位置上填充符号位

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

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

/*
    位操作符演示
*/
#include <stdio.h>
int main() {
    char ch = ~0xc3;
    int num = ch;
    printf("ch是0x%x\n", num);
    printf("3 & 5是%d\n", 3 & 5);
    printf("3 | 5是%d\n", 3 | 5);
    printf("3 ^ 5是%d\n", 3 ^ 5);
    printf("3 << 2是%d\n", 3 << 2);
    num = 0x80000000;
    printf("num >> 2是0x%x\n", num >> 2);
    printf("0x80000000 >> 2是0x%x\n", 0x80000000 >> 2);
    return 0;
}

&也可以作为单目操作符使用,这个时候它可以用来计算一个存储区的地址
这个操作符使用的时候应该写在一个存储区的前面
可以使用%p做占位符把地址数据显示在屏幕上
在我们的计算机上所有地址数据都是32个二进制数位

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

三目操作符可以从两套不同的计算规则中选择一套进行计算
三目操作符格式如下
布尔值 ? 公式一 : 公式二
如果布尔值是真就采用公式一进行计算,否则就采用公式二进行计算
不要在问号后使用赋值操作符

/*
    三目表达式演示
*/
#include <stdio.h>
int main() {
    int num = 0;
    printf("请输入一个数字:");
    scanf("%d", &num);
    num = num >= 0 ? num : 0 - num;
    //num >= 0 ? num = num : num = 0 - num;
    printf("绝对值是%d\n", num);
    return 0;
}

如果表达式里多个数字不是同一类型则计算机无法完成表达式的计算
这个时候计算机需要首先把所有数字转换成同一个类型,这个转换过程由计算机完成,叫做隐式类型转换
隐式类型转换中一定把占地小的类型转换成占地大的类型

/*
   三目表达式练习
*/
#include <stdio.h>
int main() {
    int gender = 0, height = 0, weight = 0, ret = 0;
    printf("请输入性别,身高和体重:");
    scanf("%d%d%d", &gender, &height, &weight);
    ret = gender ? height - weight < 105 : height - weight < 110;
    printf("超重结果是%d\n", ret);
    return 0;
}

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

C语言里可以随时给数字指定一个类型,这叫做强制类型转换
强制类型转换格式如下
(char)300
强制类型转换有可能导致数据丢失

/*
    类型转换演示
*/
#include <stdio.h>
int main() {
    printf("sizeof(1 ? 1 : 0.9)是%d\n", sizeof(1 ? 1 : 0.9));
    printf("-7 + 3 > 0是%d\n", -7 + 3 > 0);
    printf("-7 + 3u > 0是%d\n", -7 + 3u > 0);
    printf("(char)300是%d\n", (char)300);
    return 0;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值