初学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是以八进制的方式输出一个整数
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);
   
//     口诀:不看你怎么存,只看你怎去取
 
2.原码、反码、补码
 
 数据在计算机内部是以补码的形式储存的
 
数据分为有符号数和无符号数
     无符号数都为正数,由十进制直接转换到二进制直接存储(其实也是该十进制的补码)即可。 有符号数用在计算机内部是以补码的形式储存的。( 正数的最高位是符号位0,负数的最高位是 符号位1。
对于正数:反码==补码==原码。
对于负数:反码==除符号位以外的各位取反。补码=反 码+1)
 
      正数的首位地址为0,其源码是由十进制数转换到的二进制数字
       负数的首位地址为1,其源码后面的位也为10进制数转换过去的二进制数字,都是用补码方式表示 有符号数的
 
     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)
    
     结论:无论正数负数在内存中存储的都是补码
     
     11111111  11111111 11111111 11110101 (补码)
    -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
 signed long
 ⚠️ 注意: 相同类型不能在一起使用
 unsigned signed

 

posted @ 2015-10-22 23:38  a滴答  阅读(382)  评论(0编辑  收藏  举报