初学c课程笔记整理5-->>进制(+位运算符变量)及一些补充
是什么?有什么用?用在什么地方?(理解)
养成良好的编程习惯;
培养编程思想;
写代码之前应该先分析需求,分析完需求再开始写代码;(写注释)
1.进制
1.1进制的概念
是一种计数的方式,数值的表现形式
1.2常见的进制
十进制、二进制、八进制、十六进制
1.3进制的进位方法
十进制 0、1、2、3、4、5、6、7、8、9 逢十进一
二进制 0、1 逢二进一
书写形式:需要以0b或者0B开头,比如0b101
八进制 0、1、2、3、4、5、6、7 逢八进一
书写形式:在前面加个0,比如045
十六进制 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 逢十六进一
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五 个字母来分别表示10,11,12,13,14,15。字母不区分大小写。
书写形式:在前面加个0x或者0X,比如0x45
1.4 进制的转换
10进制转 2 进制
方法:
除2取余, 余数倒序得到的序列就是二进制表示形式
例如:将十进制(97) 10转换为二进制数
2 进制转 10 进制
方法:
每一位二进制进制位的值 * 2的(当前二进制进制位索引)
索引从0开始, 从右至左
将所有位求出的值相加
例如: 二进制11转换为10进制
0b1011 = 1 * 2^0 + 1 * 2^1 + 0 * 2^2 + 1 * 2^3
= 1 * 1 + 1 * 2 + 0 * 4 + 1 * 8
= 1 + 2 + 0 + 8
= 11
2 进制转 8 进制
三个二进制位代表一个八进制位, 因为3个二进制位的最大值是7,而八进制是逢八进一
2 进制转 16 进制
四个二进制位代表一个十六进制位,因为4个二进制位的最大值是15,而十六进制是逢十六进一
16 进制转 2 进制
方法:
将16进制的每一位拆成4为二进制位
// 1.默认就是10进制
int num = 12;
// 2.在前面加上一个0就代表八进制
int num1 = 014;
// %d是以十进制的方式输出一个整数
printf("%d\n", num1);
// %o是以八进制的方式输出一个整数
int num = 12;
// 2.在前面加上一个0就代表八进制
int num1 = 014;
// %d是以十进制的方式输出一个整数
printf("%d\n", num1);
// %o是以八进制的方式输出一个整数
printf("%o\n", num);
// 在数值前面加上0b就代表二进制
int num2 = 0b1100;
printf("%d\n", num2);
// 在数值前面加上0x就代表十六进制
int num3 = 0xc;
printf("%d\n", num3);
// %x是以十六进制的方式输出一个整数
printf("%x\n", num);
// 在数值前面加上0b就代表二进制
int num2 = 0b1100;
printf("%d\n", num2);
// 在数值前面加上0x就代表十六进制
int num3 = 0xc;
printf("%d\n", num3);
// %x是以十六进制的方式输出一个整数
printf("%x\n", num);
// 口诀:不看你怎么存,只看你怎去取
2.原码、反码、补码
数据在计算机内部是以补码的形式储存的
数据分为有符号数和无符号数
无符号数都为正数,由十进制直接转换到二进制直接存储(其实也是该十进制的补码)即可。 有符号数用在计算机内部是以补码的形式储存的。( 正数的最高位是符号位0,负数的最高位是 符号位1。
对于正数:反码==补码==原码。
对于负数:反码==除符号位以外的各位取反。补码=反 码+1)
正数的首位地址为0,其源码是由十进制数转换到的二进制数字
负数的首位地址为1,其源码后面的位也为10进制数转换过去的二进制数字,都是用补码方式表示 有符号数的
12的二进制
12在内存中存储的是它的补码
00000000 00000000 00000000 00001100
正数的特点:(三码合一) 正数的原码就是TA的反码就是TA的补码
-12
二进制的最高位我们称之为符号位
如果符号位是0代表是一个正数,
如果符号位是1代表是一个负数
10000000 00000000 00000000 00001100 (-12的原码)
12在内存中存储的是它的补码
00000000 00000000 00000000 00001100
正数的特点:(三码合一) 正数的原码就是TA的反码就是TA的补码
-12
二进制的最高位我们称之为符号位
如果符号位是0代表是一个正数,
如果符号位是1代表是一个负数
10000000 00000000 00000000 00001100 (-12的原码)
11111111 11111111 11111111 11110011(反码, 符号位不变其它位取反)
11111111 11111111 11111111 11110011
+00000000 00000000 00000000 00000001
_____________________________________________
11111111 11111111 11111111 11110100(补码 , 反码+1)
结论:无论正数负数在内存中存储的都是补码
+00000000 00000000 00000000 00000001
_____________________________________________
11111111 11111111 11111111 11110100(补码 , 反码+1)
结论:无论正数负数在内存中存储的都是补码
11111111 11111111 11111111 11110101 (补码)
-00000000 00000000 00000000 00000001 (-1)
_____________________________________________
11111111 11111111 11111111 11110100 (反码)
-00000000 00000000 00000000 00000001 (-1)
_____________________________________________
11111111 11111111 11111111 11110100 (反码)
10000000 00000000 00000000 00001011
3.位运算
1.什么是位运算符?
- 位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。 C语言供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char,short,int与long类型。
2.位运算符与
& 按位与
只有对应的两个二进位均为1时,结果位才为1,否则为0
口诀: 同1为1
- 示例:
9&5 = 1
1001
&0101
------
0001
```
规律
二进制中,与1相&就保持原位,与0相&就为0
应用场景:
按位与运算通常用来对某些位清0或保留某些位。例如把a的高位都清0,保留低八位,那么就a&255
判断奇偶: 将变量a与1做位与运算,若结果是1,则 a是奇数;若结果是0,则 a是偶数
任何数和1进行&操作,得到这个数的最低位
3.位运算符或
| 按位或
+ 只要对应的二个二进位有一个为1时,结果位就为1,否则为0
示例
9|5 = 13
1001
|0101
------
1101
4.位运算符异或
^ 按位异或
当对应的二进位相异(不相同)时,结果为1,否则为0
- 示例
9^5 = 12
1001
^0101
------
1100
规律
+ 相同整数相^的结果是0。比如5^5=0
5.位运算符取反
~ 取反
各二进位进行取反(0变1,1变0)
多个整数相^的结果跟顺序无关。比如5^6^7=5^7^6
因此得出结论:a^b^a = b
示例
~9 =-10
9的原码:0000 0000 0000 0000 0000 1001
反码:1111 1111 1111 1111 1111 0110
知道补码求原码:也是符号位不变,其他各位取反+1
1111 1111 1111 1111 1111 0110
取反
1000 0000 0000 0000 0000 1001
+1
1000 0000 0000 0000 0000 1010 // -10
4.变量存储细节
1.字节和地址
为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”。
%p是输出地址
&变量名称, 是取出变量的地址
内存以“字节为单位”
里面的每个小框框就代表着内存中的一个字节,白色数字就是每个字节的地址。可以发现,内存中相邻字节的地址是连续的
一个字节只有8位,所能表示的数据范围是非常有限的,因此,范围较大的数据就要占用多个字节,也就是说,不同类型的数据所占用的字节数是不一样的
2.变量的存储
一个变量所占用的存储空间,不仅跟变量类型有关,而且还跟编译器环境有关系。同一种类型的变量,在不同编译器环境下所占用的存储空间又是不一样的
下面的表格描述了在不同编译器环境下的存储空间占用情况
变量存储单元的第一个字节的地址就是该变量的地址
任何变量在内存中都是以二进制的形式存储。一个负数的二进制形式,其实就是对它的正数的二进制形式进行取反后再+1。(取反的意思就是0变1、1变0)
3. 变量在内存中存储的原则
先分配字节地址大内存,然后分配字节地址小的内存(内存寻址是由大到小)
因为内存寻址是由大到小,所以先定义的变量的内存地址会比后定义的大
number1地址 > number2
变量的首地址,是变量所占存储空间字节地址最小的那个地址
低位保存在低地址字节上,高位保存在高地址字节上
5.char类型
1.char类型基本概念
char是C语言中比较灵活的一种数据类型,称为“字符型”。它是用来存字符的,因此可以将一个字符常量赋值给一个字符型变量
1个字符型变量占用1个字节,共8位,因此取值范围是-2^7~2^7-1。在这个范
围内,你完全可以将字符型变量当做整型变量来使用
在某些字符前面加上”\”形成的字符,称为“转义字符”,比如\n、\t、\0
⚠️3.char类型注意点
1.当把一个字符赋值给一个char类型变量,那么系统首先查这个字符所对应的 ASCII码,然后把这个ASCII值放到变量中
2.根据变量中存储的ASCII值,去查ASCII表中对应字符,然后把这个字符打印控3.制台上,整形和 字符型可以互相转换。
3.字符型变量不能用来存储汉字
4.不支持多个字符,多个字符是字符串
6.类型说明符
1.说明长度的(它可以用于修改类型所占用的存储空间的大小)
short; short == short int == 2个字节 == %hi/ %hd
long; long == long int == 8个字节 == %li / %ld
long long; == long long int == 8个字节 == %lli / %lld
用于说明数据类型, 一般情况下和int配合使用
2.说明符号位(它可以用于修改符号位是否用于正负数)
unsigned; 无符号 , 取值正数和零 == %u
signed; 有符号, 默认就是有符号 , 取值 正数和零以及负数
3.不同类型的说明符可以混合使用
unsigned short
short; short == short int == 2个字节 == %hi/ %hd
long; long == long int == 8个字节 == %li / %ld
long long; == long long int == 8个字节 == %lli / %lld
用于说明数据类型, 一般情况下和int配合使用
2.说明符号位(它可以用于修改符号位是否用于正负数)
unsigned; 无符号 , 取值正数和零 == %u
signed; 有符号, 默认就是有符号 , 取值 正数和零以及负数
3.不同类型的说明符可以混合使用
unsigned short
signed long
⚠️ 注意: 相同类型不能在一起使用
unsigned signed
未来有你才精彩,你有未来不是梦!