Chinaunix

标题: 【急】数值转换小程序 [打印本页]

作者: zsszss0000    时间: 2015-04-09 23:50
标题: 【急】数值转换小程序
本帖最后由 zsszss0000 于 2015-04-10 00:00 编辑

char a[2];
a[0]=0x8b;
a[1]=0xd7;
unsigned int b;

ox8bd7的十进制为35799
请问怎么样计算使得b的值是35799?


作者: windoze    时间: 2015-04-10 00:25
这还不简单?

  1. b=35799;
复制代码
搞定收工。
作者: zsszss0000    时间: 2015-04-10 00:29
这个问题我自己查到了,说起来比这个要复杂,明天打算专门针对这个问题写一本书。。。。。回复 2# windoze


   
作者: hellioncu    时间: 2015-04-10 08:28
b = ((unsigned char)a1[0] << + (unsigned char)a1[1];
作者: zsszss0000    时间: 2015-04-10 08:58
昨天就是没有使用(unsigned char)来强制转换a[0]导致我调试了好长时间,要是昨天晚上早点问你的话,就可以省下好长时间了啊!
回复 4# hellioncu


   
作者: 收到    时间: 2015-04-10 09:18
        char a[2];
        a[0]=0x8b;
        a[1]=0xd7;
        unsigned int b=0;
    *(char*)&b=a[1];
        *((char*)&b+1)=a[0];
作者: hellioncu    时间: 2015-04-10 09:25
收到 发表于 2015-04-10 09:18
char a[2];
        a[0]=0x8b;
        a[1]=0xd7;


你这样会有字节序问题,移植性不好
作者: 收到    时间: 2015-04-10 09:53
回复 4# hellioncu

我不认为有字节序问题,不管是大端序,小端序。楼主说的是b的值是0x8bd7, 才不管是什么序呢。
按照X86小端序8b在高地址上,d7在低地址上。
你说有字节序问题,你的写法不一样是错的吗?你左移8b,那么你认为8b也在高地址上,d7在低地址上。
   
作者: zsszss0000    时间: 2015-04-10 10:24
本帖最后由 zsszss0000 于 2015-04-10 10:29 编辑

hellocu说的对,你这个字节序真的有问题
我昨天晚上分别在arm和x86上验证了
这种写法移植性存在问题
回复 8# 收到


   
作者: asdf2110    时间: 2015-04-10 10:34
你这样写还是有问题的吧
这种写法应该是在给b赋值时调整大小端
  1. b = (((unsigned char)a[0])<<8 | (unsigned char)a[1]);
复制代码
你那种写法强制写死了,b[0]=a[1],b[1]=a[0]
b[0] 是低地址,b[1] 是高地址

回复 8# 收到


   
作者: ahui886    时间: 2015-04-10 11:00
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. typedef union
  4. {
  5.   uint8_t byte[2];
  6.   uint16_t word;
  7. } xxx_t;

  8. int main( void )
  9. {
  10.   xxx_t test =
  11.   {
  12.     .byte[1] = 0x8b,
  13.     .byte[0] = 0xd7
  14.   };

  15.   uint16_t b;

  16.   b = test.word;

  17.   printf( "b = %hu\n", b );

  18.   return 0;
  19. }
复制代码

作者: 紫柳    时间: 2015-04-10 11:44
定义字节序宏,不同字节序采用不同的组合方法
作者: zsszss0000    时间: 2015-04-10 14:13
这种写法会出问题
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. using namespace std;
  5. int main ( int argc, char *argv[] )
  6. {
  7.         char s_c[2]={0};
  8.         unsigned char u_c[2]={0};
  9.        
  10.         int s_i=0;
  11.         unsigned int u_i=0;
  12.         signed short int s_s=0;
  13.         unsigned short int u_s=0;

  14.         s_c[0]=0x2E;
  15.         s_c[1]=0xE0;

  16.         u_c[0]=0x2E;
  17.         u_c[1]=0xE0;

  18.         printf ( "%x %x %x %x\n",s_c[0],s_c[1],u_c[0],u_c[1]);
  19.         printf ( "%x %x %x %x\n",s_c[0]<<8,s_c[1],u_c[0]<<8,u_c[1]);
  20.         printf ( "%x %x\n",s_c[0]<<8+s_c[1],u_c[0]<<8+u_c[1]);
  21.         printf ( "%x %x\n",s_c[0]<<8|s_c[1],u_c[0]<<8|u_c[1]);
  22.         printf ( "%x %x\n",s_c[0]*256+s_c[1],u_c[0]*256+u_c[1]);
  23.         printf ( "%x %x\n",s_c[0]*0x100+s_c[1],u_c[0]*0x100+u_c[1]);

  24.         cout<<endl<<endl;

  25.         cout<<"aaaaaaaaaa"<<endl;
  26.         s_i=u_c[0]<<8+u_c[1];
  27.         u_i=u_c[0]<<8+u_c[1];
  28.         s_s=u_c[0]<<8+u_c[1];
  29.         u_s=u_c[0]<<8+u_c[1];

  30.         cout<<dec<<s_i<<":"<<hex<<"0x"<<s_i<<endl;
  31.         cout<<dec<<u_i<<":"<<hex<<"0x"<<u_i<<endl;
  32.         cout<<dec<<s_s<<":"<<hex<<"0x"<<s_s<<endl;
  33.         cout<<dec<<u_s<<":"<<hex<<"0x"<<u_s<<endl;

  34.         cout<<"bbbbbbbbbb"<<endl;
  35.         s_i=u_c[0]<<8|u_c[1];
  36.         u_i=u_c[0]<<8|u_c[1];
  37.         s_s=u_c[0]<<8|u_c[1];
  38.         u_s=u_c[0]<<8|u_c[1];

  39.         cout<<dec<<s_i<<":"<<hex<<"0x"<<s_i<<endl;
  40.         cout<<dec<<u_i<<":"<<hex<<"0x"<<u_i<<endl;
  41.         cout<<dec<<s_s<<":"<<hex<<"0x"<<s_s<<endl;
  42.         cout<<dec<<u_s<<":"<<hex<<"0x"<<u_s<<endl;

  43.         cout<<"cccccccccc"<<endl;
  44.         s_i=u_c[0]*0x100+u_c[1];
  45.         u_i=u_c[0]*0x100+u_c[1];
  46.         s_s=u_c[0]*0x100+u_c[1];
  47.         u_s=u_c[0]*0x100+u_c[1];

  48.         cout<<dec<<s_i<<":"<<hex<<"0x"<<s_i<<endl;
  49.         cout<<dec<<u_i<<":"<<hex<<"0x"<<u_i<<endl;
  50.         cout<<dec<<s_s<<":"<<hex<<"0x"<<s_s<<endl;
  51.         cout<<dec<<u_s<<":"<<hex<<"0x"<<u_s<<endl;

  52.         return 1;
  53. }
复制代码
2e ffffffe0 2e e0
2e00 ffffffe0 2e00 e0
2e00 2e00
ffffffe0 2ee0
2de0 2ee0
2de0 2ee0


aaaaaaaaaa
11776:0x2e00
11776:0x2e00
11776:0x2e00
11776:0x2e00

bbbbbbbbbb
12000:0x2ee0
12000:0x2ee0
12000:0x2ee0
12000:0x2ee0
cccccccccc
12000:0x2ee0
12000:0x2ee0
12000:0x2ee0
12000:0x2ee0


红颜色标记的部分不对吧,为什么不等于0x2ee0呢?
u_c[0]<<8+u_c[1];

=u_c[0]<<8|u_c[1];
到底有什么差别呢?


回复 4# hellioncu


   
作者: hellioncu    时间: 2015-04-10 14:24
zsszss0000 发表于 2015-04-10 14:13
这种写法会出问题2e ffffffe0 2e e0
2e00 ffffffe0 2e00 e0
2e00 2e00


优先级问题,请加上括号
作者: zsszss0000    时间: 2015-04-10 14:41
好了,大神!
优先级这种问题真的很头疼!!!回复 14# hellioncu


   
作者: hellioncu    时间: 2015-04-10 14:58
zsszss0000 发表于 2015-04-10 14:41
好了,大神!
优先级这种问题真的很头疼!!!回复 14# hellioncu


自己拿不准的就加上括号吧,人家看了也明白。
现在有些编译器比较智能,会给你警告的,留意下就行
作者: 花依然绽放    时间: 2015-04-11 19:11





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2