c/c++ 16进制数

来源:互联网 发布:阿里云服务器部署网站 编辑:程序博客网 时间:2024/05/07 23:05

  首先,什么是16进制数,16进制数就是满16进一的数。例如0xf+1=ox10,16进制数的是以ox开头的,这主要是为了和10进制进行区别,例如1234和0x1234,如果16进制不以ox开头的话,那么岂不是16进制和10进制就无法区别了。16进制的每一位超过9之后,便是ABCDEF 分别对应10,11,12,13,14,15。即16进制数的每一位最大就只能是f,如果超过了f,那么就会进位。好啦,16进制数大概清楚了,那么接下来说说16进制数有什么好处了吧!

    1.16进制数可以非常直观的表示出我们数据在内存中是如何存储的。在讲这个之前,我先插入一个小内容:大字节序和小字节序。

   小字节序:数据的低位存储在内存的低位,数据的高位存储在数据的高位。

    大字节序:数据的低位存储在内存的高位,数据的高位存储在内存的高位。

  小字节序:

    例如:一个long型的数据0x12345678

                                  0x0029f458  0x78

        0x0029f459  0x56

        0x0029f45a  0x34

        0x0029f45b  0x12

   大字节序:     

                             0x0029f458  0x12

        0x0029f459  0x34

        0x0029f45a  0x56

        0x0029f45b  0x78

对于我们使用的X86的计算机(也就是我们现在的PC机),都是采用小字节序。

char szBuf[10]àszBuf[0, 1,...]的地址从小到大    
       •比如说 char c = ‘0’ = 0x30 = (110000)2= (00110000)2//注意char型的变量,占一个字节,一个字节占八个比特位。
又比如说 int a = 123456789 = 0x075BCD15
    = ( 00000111 # 01011011 # 11001101 #00010101)2//小标括号下标的2表示这是二进制形式,#是我为了分隔
     每一个比特位特意加的。正确的形式应该是:00000111010110111100110100010101
内存存储方式:10101000 # 10110011 # 11011010 # 11100000
注:这儿数据的低位和内存的低位,初学者可能有点晕,为了容易记忆。可以看成最右边的是数据的低位,最左边的是内存的低位。

光说不练假把式,我们可以通过程序来验证这一结论:


// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include<string>




typedef struct tagArea
{
char c0 : 1;
char c1 : 1; 
char c2 : 1;
char c3 : 1;


char c4 : 1;
char c5 : 1;
char c6 : 1;
char c7 : 1;
}AREA_S;


typedef struct tagAreaInt
{
AREA_S  aBit[4];
}AREAINT_S;


int _tmain(int argc, _TCHAR* argv[])
{
char c = '0';
AREA_S *pstC = (AREA_S*)(&c);
printf("字符0的ascii: %d\n", '0');

printf("各个bit位:%u%u%u%u %u%u%u%u\n", pstC->c0 & 1, pstC->c1 & 1, pstC->c2 & 1, pstC->c3 & 1, pstC->c4 & 1, pstC->c5 & 1, pstC->c6 & 1, pstC->c7 & 1);


int a = 123456789;
AREAINT_S *pInt = (AREAINT_S*)(&a);


for (int i = 0; i < 4; i++)
{
printf("%u%u%u%u%u%u%u%u # ", 
(pInt->aBit[i]).c0 & 1, 
(pInt->aBit[i]).c1 & 1, 
(pInt->aBit[i]).c2 & 1, 
(pInt->aBit[i]).c3 & 1, 
(pInt->aBit[i]).c4 & 1, 
(pInt->aBit[i]).c5 & 1, 
(pInt->aBit[i]).c6 & 1, 
(pInt->aBit[i]).c7 & 1);
}
printf("\n");


system("pause");


return 0;
}

输出:
             
       这便证明了小字节序在内存中数如何存储的。
       好了,咱们回归正题,为什么说16进制数能直观的表示一个数在内存中是怎样存储的呢?
       同样:
char c= ‘0’ = 0x30 = (110000)2= (00110000)2
–我们直接可以看出来,这个 char,前面4个bit位是 3
–后面 4个bit位是 0   (0011)(0000)

int a =123456789 = 0x075BCD15
二进制形式:0000  0111  0101  1011  1100  1101  0001  0101
内存中存储形式为:10101000 10110011  11011010  11100000 

-0----->0000
-7----->0111
-5---->0101
-B---->1011
-C---->1100
-D---->1101
-1---->0001
-5----->0101
可见16进制数中的每一位对应4个比特位。
这样哪个位数存在哪个字节都能一目了然,可以更加直观反映内存存储数据、处理数据的实际情况。


int a =0x075BCD15 (最高16进制位大于8,表示是负数)
–è 前面 4个bit位是 0, 接下来4个bit位是 0111
int a =0x7FFFFFFF
–è 最大的正整数
int a =0x80000000 
–è 最小的负整数 (最高bit位为1,其它bit位为0)
unsignedint a =0xFFFFFFFF
–è 最大的整数
int a =0xFFFFFFFF
– è a = -1 (0xFFFFFFFF + 1 = 0)  

  16进制数广泛的应用在了编程中,在winows编程中,VS定义得各种消息和指令都是用16进制数表示的,这就可以看出16进制数在在程序里应用广泛,掌握16进制的应用是非常必要的。

0 0