linux c中的byte转换成short

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
负数的二进制数有点特殊啊:
*******************************************************************************************************************
  负数的二进制表示是绝对值取反加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的二进制表示。
**********************************************************************************





你可能感兴趣的:(linux c中的byte转换成short)