C语言基础(八)- 进制转化、计算机补码、位运算符
2016-12-23 10:23
274 查看
进制转化
一个数字的大小本质上都是表示状态数的多少数字的表示可以用不同的进制
十进制转r进制:整数部分–除r取余,直至商0,余数倒置即可,小数部分–乘r取整,直至积为0,整数正序排列即可
二进制转10进制:8421码
补码的相关知识
在介绍补码之前先来认识其他的一些二进制码:1、原码:
也叫符号—绝对值码,最高位0表示正、1表示负,其余二进制是该数字的绝对值的二进制位
如-5的原码是10101, 原码简单易懂,但是它加减复杂,存在加减乘除四种运算,增加了CPU的复杂度
还有就是源码制下0的表示不唯一,所以源码在计算机中从来不使用。
2、反码:
对原码每一位取反,在计算机中基本无使用
3、移码:
表示数值平移n位,(n称为移码量),移码主要用于浮点数阶码的存储
以上为认识补码的相关背景知识。
那么什么是补码呢?为什么要引入补码?
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
补码的特性:
一个整数的原码与其补码相加,和为模
对一个整数的补码再求补码,等于该整数自身
补码的正零与负零表示方法相同
通过源码求补码:
[+73]补 = 01001001 [-73]补 = 100000000 - 01001001 = 10110111 [+1]补 = 00000001 [-1]补 = 100000000 - 00000001 = 11111111 [+127] = 01111111 [-127] = 100000000 - 01111111 = 10000001 综上: 1. 整数的补码与其原码相同 2. 0的补码仍然为0 3. 负数的补码可以通过其正数的原码“取反加一”,并且最高符号位也参与运算得到 扩展: 根据补码的定义,可以证明: [X]补 + [Y]补 = [X+Y]补 [X]补 - [Y]补 = [X-Y]补 这表明,两个补码加减的结果也是补码,而且在运算时,符号位可同数值部分作为一个整体参加运算,如果符号位有进位则舍弃进位。 计算机中的加减运算: 如:4-6=? 0000 0100 + 0000 0110-->1111 1001-->1111 1010 ----------------------------------- 1111 1110 (所得结果为补码,符号位为负)-->0000 0001-->0000 0010 故最终结果为 -2 [注] 一个数的补码为(1111 1110),求其数值? 分析:最高位为1,则该数肯定为负数,并且我们知道“补码的补码就是其对应的非负数值”,求得0000 0010, 故这个数的数值为 -2。
程序演示:
/** * 计算机二进制运算程序演示 */ # include <stdio.h> int main() { int a = 0; short int i = -3; int j = -3; long int k = -3; char m = 'A'; int n = 0XFFFFFFE1; //11111111111111111111111111100001 //负数最高符号位均补1 printf("%#X\n",a); //0 printf("%#X\n",i); //0XFFFFFFFD printf("%#X\n",j); //0XFFFFFFFD printf("%#X\n",k); //0XFFFFFFFD printf("%#X\n",m); //0X41 printf("%d\n",n); //-31 return 0; }
常见的位运算符
按位与&按位或|
按位取反\~
按位异或^
按位左移和按位右移 \<< >>
/* 5&7=5 5&-7=1 5|7=7 5|-7=-3 ~5=-6 ~7=6 5^7=2 5^-7=-4 5<<1=10 -7<<1=-14 5>>1=2 -7>>1=-4 */ # include <stdio.h> int main() { printf("5&7=%d\n", 5&7); //5的二进制补码是...0101,7的二进制补码是...0111,两者相与后补码变为...0101,输出十进制结果为5 printf("5&-7=%d\n", 5&-7); //5的二进制补码为00000101,-7的二进制补码为11111001,5&-7=00000001,即输出结果为1 printf("5|7=%d\n", 5|7); //5的二进制补码为00000101,7的二进制补码为00000111,5|7=00000111,即输出结果为7 printf("5|-7=%d\n", 5|-7); //5的二进制补码为00000101,-7的二进制补码为11111001,5|-7=,结果的补码为11111101,是个负数,结果为-3 printf("~5=%d\n", ~5); //5的二进制补码为00000101,则~5=11111010,是个负数,结果为-6 printf("~7=%d\n", ~-7); //-7的二进制补码为11111001,则~-7=00000110,结果为6 printf("5^7=%d\n", 5^7); //5的二进制补码为00000101,7的二进制补码为00000111,5^7=00000010,结果为2 printf("5^-7=%d\n", 5^-7); //5的二进制补码为00000101,-7的二进制补码为11111001,5^-7=111111100,结果为-4 printf("5<<1=%d\n", 5<<1); //5的二进制补码为00000101,5<<1=00001010,结果为10 printf("-7<<1=%d\n", -7<<1); //-7的二进制补码为11111001,-7<<1=11110010,结果为-14 printf("5>>1=%d\n", 5>>1); //5的二进制补码为00000101,5>>1=00000010,结果为2 printf("-7>>1=%d\n", -7>>1); //-7的二进制补码为11111001,-7>>1=11111100,结果为-4 return 0; }
相关文章推荐
- C语言基础一之预备知识(计算机结构组成、计算机系统组成、进制、原码反码补码)
- 计算机基础知识_进制转化
- 恶补计算机基础知识 补码 进制 基本数据类型字节
- C语言基础编程之进制转化
- Java语言基础-进制及原码补码反码
- 学ios需要了解的C语言基础知识-4-进制
- C语言基础 进制
- JavaSE基础之计算机语言概述
- c语言基础 补码 占位符
- 计算机一些基本进制单位及细节基础知识
- 黑马程序员--C语言基础--进制
- 好的JAVA思路——利用补码运算和位运算的巧用来实现进制转化
- IT 人员必学的最基础知识(二)——进制相互转化
- 一 基础--进制转化
- C语言基础-进制、原反补码、位运算
- 【Cocos基础知识】计算机组成、位、进制、算法
- C语言基础之函数、内存剖析及位运算符
- Java基础--->01.计算机软件及Java语言的背影和发展历史,以及环境变量配置。
- C语言2011计算机二级c语言考点:c语言的基础知识
- [编程基础] 计算机的原码, 反码和补码