进制转换
一、二进制数:位、字节与字
位:只有0、1两种状态,简称bit;
字节:由8个二进制数组成,称为8位,简称BYTE
字:由两个字节组成,简称DWORD。1字=2字节=32位
例如:U盘的单位是GB(GBYTE),字节。网速Mb,bit。
二、八进制
以8为基数的数制系统(0-7),C语言中0表示八进制,即0123表示八进制123。-011表示八进制-11,即十进制-(1*8^1+1*8^0)=-9
三、十六进制
以16为基数的数制系统(1-9,A-F),C语言中0x表示十六进制,即0x123表示十六进制123,即十进制1*16^2+2*16^1+3*16^0=256+32+3=291.
四、进制转换
4.1 以二进制为基准转换
eg:将以下二进制数分别转换为八进制,十六进制。
110101001001010
(1)转为八进制:从后往前,每3位为一组。
二进制: 110 101 001 001 010
八进制: 6 5 1 1 2
(2)转为十六进制:从后往前,每4位为一组。
二进制: 110 1010 0100 1010
十六进制: 6 a 4 a
4.2 以十进制为基准转换
(1)十进制转二进制,用十进制数作为被除数,2作为除数,取商和余数,连续除直到商为0,将余数倒过来就是转换后的结果。
(2)十进制转八进制,用十进制数作为被除数,8作为除数,取商和余数,连续除直到商为0,将余数倒过来就是转换后的结果。
eg: 将十进制50转化为八进制:
解:除数 商 余数
8 6 2
8 0 6
得:八进制 062。
(3)十进制转十六进制,用十进制数作为被除数,16作为除数,取商和余数,连续除直到商为0,将余数倒过来就是转换后的结果。
原码、反码、补码
数据在内存中是以二进制形式存放的。(不同的编译系统为整型数据分配的字节数是不同的,比如Turbo C 2.0有两个字节的(16位),Visual C ++分配四个字节(32位))
实际上,数值是以补码表示的。一个正整数的补码=原码=反码。负数的原码是将
一、原码
最高位数为符号位(0表示正数,1表示负数)
eg:+7的原码是 0000 0111
-7的原码是 1000 0111
二、反码
一个数的值为正,则其反码和补码相同
若一个数的值为负,那么符号位为1,其他各位与原码相反。
eg:+7的反码是 0000 0111
-7的反码是 1111 1000
三、补码
原码和反码都不利于计算机的运算,如:原码表示7和-7相加,还需要判断符号位。
正数;原码=反码=补码
负数:最高位为1,其余各位原码取反,然后+1
eg:-7的补码=?
解:-7的原码=1000 0111
-7的反码=1111 1000(原码取反)
-7的补码=1111 1001(反码加1或者原码取反加1)
+255的二进制编码无论为何,它的原码还是+255,而且它的反码和补码都是+255.
-255的二进制编码这样求得:由于它已超出一个8位字节所能表示的有符号数的范围,所以至少要用两个字节来表示,现就以2字节为例来说明.255的二进制编码是1111 1111,把它扩展为2字节是0000 0000 1111 1111,还要加个负号,就是要在数据的最高位前放1,就成了0000 0001 1111 1111,
原码:而且根据实际需要,这负号要向高位扩展到满字节,即:1111 1111 1111 1111,
而反码规则是,符号位不变,数据位按位取反,既得:1111 1111 0000 0000.这数用十六进制表示是0xFF00,这就是计算机里-255的反码.
补码:在反码的基础上加1得:1111 1111 0000 0001.
用补码进行运算时,减法可通过加法实现
eg1:7-6=1
算它时将7的补码和-6的补码相加:0000 0111 + 1111 1010 = 1 0000 0001 (第一个1为符号位)
eg1:-7+6=-1
算它时将-7的补码和6的补码相加:1111 1001+ 0000 0110 = 1111 1111 (第一个1为符号位。注:这个值是-1的补码)
sizeof关键字
sizeof是c语言关键字,用来求指定数据类型在内存中的大小。其单位是:字节。
在4字节系统中,一个整数最大可以存放(2^32)-1位。
eg:
printf(“%d\n”,10);
或者
int i = 10;
printf(“%d\n”,i);
结果是: 4字节