标题:5.二进制和16进制数,以及补码的概念    浏览:124次


一共有3种类型的数:

1. 十进制表示的数, 如 55,,逢10进一,从0到9依次为0 1 2 3 4 5 6 7 8 9 这10个


2. 十六进制表示的数,如 01FF,,逢16进一,从0到15依次为0 1 2 3 4 5 6 7 8 9 a b c d e f这16个


3. 二进制表示的数,如0111010101这样的,逢2进一,从0到1依次为0 1这2个


所以十进制数16可以用十进制表示为16,用十六进制表示为 10 (逢16进一,所以 十六进制的10 =1X16+0X1=十进制的16 ) , 用二进制表示为 10000 (逢2进一,所以从右到左第1位可达1,第2位为可达2=2x1,第3位可达4=2x2,第4位可以达到8=2x2x2,第五位可 达16,所以十进制数16用二进制表示就为 10000)


同理,

十进制数17,用十六进制表示为11,用二进制表示为10001

十进制数18,用十六进制表示为12,用二进制表示为10010

十进制数19,用十六进制表示为13,用二进制表示为10011

十进制数20,用十六进制表示为14,用二进制表示为10100

十进制数21,用十六进制表示为15,用二进制表示为10101

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【补码】:

十进制数转换为二进制补码

正整数的补码与原码相同。


负整数补码求法:先求该负数绝对值的二进制数,然后将所有位取反,末位加1,不够位数时左边补1。比如int型的-3,因为-3的绝对值是3, int型占32位,所以int型3的二进制代码为:

0000 0000 0000 0000 0000 0000 0000 0011

然后所有位取反,就是:

1111 1111 1111 1111 1111 1111 1111 1100

最后末位加1就是:

1111 1111 1111 1111 1111 1111 1111 1101


零的补码是唯一的,全是0。


二进制补码转换为十进制数

已知一个数的补码,求原码的操作其实就是对该补码再求补码:


如果最高位是0,则表明是正整数,原码和补码相同。比如补码为:

00000000000000000000000000001111

最高位是0,表明这个数是正整数。则原码和补码相同,所以直接转换成十进制数为15。

如果最高位是1,则表明是负整数,则原码为:将所有位取反(不管是符号位还是有效数字位),然后末位加1。此时得到的是无符号型的二进制数,即所有位数都是数字位,没有符号位。所以算出来的肯定是一个正整数,这个正整数的相反数就是该补码对应的十进制数。比如补码:11111111111111111111111111111000最高位是1,表明这个数是负整数。则将包括最高符号位在内的所有位全部取反得:00000000000000000000000000000111然后末位加1得:00000000000000000000000000001000此时就得到了一个正整数,直接转换成十进制数为8,所以补码所对应的十进制数为-8。

int型变量所能存储的范围

int型变量占4字节,就是32位,所以它所能存储的最大的正整数是01111111111111111111111111111111,即2147483647。注意,最高位是符号位,正数用0表示。那么为什么最大整数是01111111111111111111111111111111?再加1会怎样?我们来试一下,二进制逢二进一,再加1就变成10000000000000000000000000000000。最左边是1,就变成负数了,所以不能再大了。这个负数的值是-2147483648,它是int型变量所能存储的最小的负整数。


short类型变量占两字节,就是16位,它所能存储的最大的正整数是0111111111111111,把它转换成十进制数就是32767。如果再加1就会变成1000000000000000,最左边是1,就变成负数了。这个负数的值是-32768,它是short类型变量所能存储的最小的负数。

————————————————

# include<stdio.h>



int main(void)

{

    int i = 128;

    char ch = i;


    printf("%d\n", ch);


    return 0;

}

char类型占1字节,就是8位,它最大所能存储的正整数是01111111,即127。现在将int型的整数128赋予它,它放不下,这个叫“溢出”。那么溢出的话输出会是多少呢?128是int型,占4字节,它的二进制代码为00000000000000000000000010000000。但是现在要将它赋给一个只有8位的char型变量,所以只能将低8位的10000000放进去,其他的都会被截掉。整数在计算机中都是以补码的形式存储的,此时10000000在“计算机的眼里”是一个补码。最左边是1表示是负数。补码10000000所对应的十进制数是-128,所以最后输出的就是-128。因此溢出会使最大正整数变成最小负整数。