码迷,mamicode.com
首页 > 编程语言 > 详细

C语言进制基本概念

时间:2015-10-19 01:48:12      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:

进制:是一种计数的方式 
常见的进制:十进制 二进制 八进制 十六进制 生活中都是十进制
二进制:逢二进1  书写方式以0b或者0B开头 
八进制:逢八进1 书写形式以0开头  输出%o
十六进制:逢十六进1书写形式以0x开头  输出%x
技术分享
    结论:无论正数负数在内存中存储的都是补码
原码反码补码的概念
数据在计算机内部都是以补码的形式存储
数据分为有符号和无符号数据
无符号都正数,由十进制直接转换到二进制直接存储即可
正数的最高位是0,负数的最高位是1,对于正数:
原码 == 反码 == 补码
 
负数的首位为1,其源码后面的为也为10进制转换到的二进制数字,都是用补码的方式表示有符号数的
 
原码—>就是第一位表示符号,其余表示值
原码:[+1]0000 0001
原码:[-1]1000 0001
反码:正数的反码是其本身
负数的反码是在原码的基础上,符号位不变,其余各个位取反
原码:[+1]0000 0001 反码:0000 0001
原码:[-1]1000 0001 反码:1111 1110
补码:
正数的补码就是其本身
负数的补码就是在原有的基础上,符号位不变,其余各取反,最后+1(在反码的基础上+1)
原码:[+1]0000 0001 反码:0000 0001 补码:0000 0001
原码:[-1]1000 0001 反码:1111 1110 补码:1111 1111
 
机器可以只有加法而没有减法,根据运算法则减去一个正数等于加上一个负数(1-1 == 1+( 1+ -1
)
 
位于运算符
位于运算是按二进制进行的运算,语言??供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char,short,int与long类型。
 
位运算符与
&按位于
 
  • 只有对应的两个二进位均为1时,结果位才为1,否则为0
  • 口诀: 同1为1
9&5 = 1
1001
&0101
------
 0001
规律
二进制中,与1相&就保持原位,与0相&就为0
应用场景
判断奇偶性:将变量a与1做位与运算,若结果是1,则 a是奇数;若结果是0,则 a是偶数
任何数和1进行&操作,得到这个数的最低位
  1001
& 0001
------------
  0001
位运算符或
| 按位或
只要对应得二进位有一个为1时,结果都为1,否则为0
示例
9|5 = 13 1001 |0101 ------ 1101
 
位运算符异或
^按位异或
当对应的进位相异( 不相同)时,结果为1,否则为0
示例
9^5 = 12

 1001
^0101
------
 1100
 
位运算符取反
各二进位进行取反(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
 
左移运算符
把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方
  • 由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性
2<<1; //相当于 2 *= 2 // 4
2<<2; //相当于 2 *= 2^2; // 8
右移位运算符
把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方
    • 为正数时, 符号位为0,最高位补0
    • 为负数时,符号位为1,最高位是补0或是补1
    • 取决于编译系统的规定
    • 移出的位砍掉, 缺少的以为最高位是0就补0是1就补1(是在当前操作系统下)
  • 应用场景
    • 快速计算一个数除以2的n次方
    • 实现
          int len = sizeof(int)*8;
          int temp;
          for (int i=0; i<len; i++) {
              temp = num; //每次都在原数的基础上进行移位运算
              temp = temp>>(31-i); //每次移动的位数
              int t = temp&1; //取出最后一位
              if(i!=0&&i%4==0)printf(" "); printf("%d",t);
          }
 
变量的内存 分析
先分配字节地址大内存,然后分配字节小地值(内存寻址是由比后定义的大)
变量的首地址值是变量所占存储空间字节最小的那个地址
 
技术分享
 
地位保存在低地址上,高位保存在高地址上
 
10的二进制: 0b00000000 00000000 00000000 00001010
            高字节←                       →低字节
 
字节和地址
内存中是字节为单位
一个字节只有8位,所表示的数据范围是非常有限的.因此,范围较大的数据就要占用多个字节,也就是说不同的数据占用的字节数是不一样的
  • 一个变量所占用的存储空间,不仅跟变量类型有关,而且还跟编译器环境有关系。同一种类型的变量,在不同编译器环境下所占用的存储空间又是不一样的
 
技术分享
  • 变量存储单元的第一个字节的地址就是该变量的地址
  • 任何变量在内存中都是以二进制的形式存储。一个负数的二进制形式,其实就是对它的正数的二进制形式进行取反后再+1。(取反的意思就是0变1、1变0)
 
char类型数据的原理
 
 char a=‘a‘ ----->取出‘a‘的ASCII码值,97,然后转换2进制,存储在一个字节中
 
1把一个字符赋值给一个char类型变量,那么系统首先查这个字符所对应的ASCII码,然后把这个ASCII值放到变量中
1根据变量中存储的ASCII值,去查ASCII表中对应字符,然后把这个字符打印控制台上,整形和 字符型可以互相转换。
  • 输入一个小写字母,要求转换成大写输出
  • 分析
a ....z 对应ASCII表中的值97...122
A 65 a 97 差了32

  • 实现
char toLower(char c){
    char ch;
    if (c>=‘a‘&&c<=‘z‘) {
        ch= c-32;
    }
    return ch;
}
 
类型说明符
  • C语言提供了以下4种说明符,4个都属于关键字:
    • short 短型 等价于 short int
    • long 长型 等价于 long int
    • signed 有符号型
    • unsigned 无符号型
  • 这些说明符一般就是用来修饰int类型的,所以在使用时可以省略int
  • 在64bit编译器环境下,int占用4个字节(32bit),取值范围是-2^31~2^31-1;
  • short占用2个字节(16bit),取值范围是-2^15~2^15-1;
  • long占用8个字节(64bit),取值范围是-2^63~2^63-1
 

C语言进制基本概念

标签:

原文地址:http://www.cnblogs.com/mshong/p/4890766.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!