首先,什么是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机),都是采用小字节序。
//
#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;
}
输出: