void say()
{
char s[20] = {0x80,0x00,0xf3,0xf4,0x00,0x2a};
char * temp = s;
int i = 0;
for(i = 0;i<6;)
{
short s1 = (short)((temp[i] << 8) + (temp[i+1] << 0));
i = i +2;
printf("%d\n",s1);
}
//printf("%s",s);
/**
int *i;
i = (int *)s;
printf("%s\n",s);
printf("%d\n",*i);
**/
}
这解释下这个函数式干吗使用的:
我们定义了6个Char类型(char是单字节的 占8bit即&&&& &&&& &代表0或者1)的数值,而现在我们看到了是将这个char类型的给合成一个short数值,在linux中是没有Byte这个类型的我们就用char类型来代替它。
所以我们的意图很明显就是要在取到的数组中,取两个char(Byte字节)的数值。
所以我们看打印出来的东西:
-32768
-3340
42
其中第三个是小数值的来解释下吧:
0x00,0x2a 是十六进制数,其中第一个是左移8个字节(0000 0000 ***** ****),后面是 0010 1010合起来
0000 0000 **** ****
0010 1010
可不就是42么,怎么还有负值呢,第一位是符号位呗
以0x80,0x 00为例吧
0x 80 1000 0000
0x 00 0000 0000
这个明明是32768好吧,怎么回事啊,会是负值呢,其实我们忘记了符号为了,其实这前面还有符号位1,就是负值了,
unsigned short 的范围:0~65535
short 的范围:-32768~32767
short 的范围:-32768~32767
负数的二进制数有点特殊啊:
*******************************************************************************************************************
负数的二进制表示是绝对值取反加1.
可以先把十进制的绝对值转化为16进制数,然后再每位10进制转化为4位二进制位,再取反,最后末位加1即为对应的二进制数。
例如:-10
1.绝对值为10,对应16进制为A,则二进制位0000 0000 0000 1010
2.二进制取反为1111 1111 1111 0101
3.末位加1为 1111 1111 1111 0110, 即为-10的二进制表示。
可以先把十进制的绝对值转化为16进制数,然后再每位10进制转化为4位二进制位,再取反,最后末位加1即为对应的二进制数。
例如:-10
1.绝对值为10,对应16进制为A,则二进制位0000 0000 0000 1010
2.二进制取反为1111 1111 1111 0101
3.末位加1为 1111 1111 1111 0110, 即为-10的二进制表示。
**********************************************************************************