C语言中char转换成short,该怎么办??

_牧马人_ 2011-08-11 02:02:02
我现在在编一个程序,想把两个char类型的十六进制数拼凑在一起,组成一个十六位的十六进制数,即short类型,请问高手我该怎么办?????



例如:char a=0xFE;
char b=0xAB;
short c=0xABFE;
我也试过移位加的办法,问题是a,b都是八进制的,怎么移八位啊????


高手快快解救我》。。。
...全文
2915 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
witwolf 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wangminghz2 的回复:]

引用 9 楼 icemornings 的回复:

虽然说1、2楼的方法没有错,但是我刚刚翻了下K&R的《C程序设计语言》,里面有这么一段话:
A.6.1 整型提升
在一个表达式中,凡是可以使用整型的地方都可以使用带符号或无符号的字符、短整型
或整型位字段,还可以使用枚举类型的对象。如果原始类型的所有值都可以用int类型表示,
则其值将被转换为int类型;否则将被转换为……
[/Quote]
++
wangminghz2 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lyramilk 的回复:]

个人习惯上面弄乱了,这样。
C/C++ code

union conv{
struct{
char a;
char b;
};
short c;
};

union conv k;
k.a = 0xfe;
k.b = 0xab;
printf("k.c=%d\n",k.c);
[/Quote]

正解!
wangminghz2 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 icemornings 的回复:]

虽然说1、2楼的方法没有错,但是我刚刚翻了下K&R的《C程序设计语言》,里面有这么一段话:
A.6.1 整型提升
在一个表达式中,凡是可以使用整型的地方都可以使用带符号或无符号的字符、短整型
或整型位字段,还可以使用枚举类型的对象。如果原始类型的所有值都可以用int类型表示,
则其值将被转换为int类型;否则将被转换为unsigned int类型。这一过程称为整型提升
……
[/Quote]

是否考虑将right operand强制转化成short,再赋值?
lyramilk 2011-08-11
  • 打赏
  • 举报
回复
个人习惯上面弄乱了,这样。

union conv{
struct{
char a;
char b;
};
short c;
};

union conv k;
k.a = 0xfe;
k.b = 0xab;
printf("k.c=%d\n",k.c);
lyramilk 2011-08-11
  • 打赏
  • 举报
回复
不必转换。

char a=0xFE;
char b=0xAB;
short c=0xABFE;

union conv{
struct{
char a;
char b;
};
short c;
};

:char a=0xFE;
char b=0xAB;
short c=0xABFE;

union conv k;
k.a = 0xfe;
k.b = 0xab;
printf("k.c=%d\n",k.c);
icemornings 2011-08-11
  • 打赏
  • 举报
回复
随叫随到就不不必了……关键是把帖子结了,我们有分拿了就好……
[Quote=引用 8 楼 lijm_050505 的回复:]

谢谢各位高手的慷慨相助,在下铭记在心,以后网上有事,我随叫随到。
[/Quote]
icemornings 2011-08-11
  • 打赏
  • 举报
回复
虽然说1、2楼的方法没有错,但是我刚刚翻了下K&R的《C程序设计语言》,里面有这么一段话:
A.6.1 整型提升
在一个表达式中,凡是可以使用整型的地方都可以使用带符号或无符号的字符、短整型
或整型位字段,还可以使用枚举类型的对象。如果原始类型的所有值都可以用int类型表示,
则其值将被转换为int类型;否则将被转换为unsigned int类型
。这一过程称为整型提升
(integral promotion)。
................
A.7.8 移位运算符
移位运算符<<和>>遵循从左到右的结合性。每个运算符的各操作数都必须为整型,并且
遵循整型提升原则。

---------------------------------
综上,char型最终都会被转换成int型,因此可以不用强制转换,直接这样写即可:

char a = 0xFE;
char b = 0xAB;
short c; /* 0xABFE已经超过2^15 = 32768,因此最好加个unsigned */

/* 不必强制转换b和a */
c = (b << 8) | (a & 0xFF);
_牧马人_ 2011-08-11
  • 打赏
  • 举报
回复
谢谢各位高手的慷慨相助,在下铭记在心,以后网上有事,我随叫随到。
icemornings 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]

更正上帖
C/C++ code
char a=0xFE;
char b=0xAB;
short c;
c=(((short)b)<<8)|((short)a&0x00FF);//0xABFE
[/Quote]
++10086
懒得打字 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]

更正上帖
C/C++ code
char a=0xFE;
char b=0xAB;
short c;
c=(((short)b)<<8)|((short)a&0x00FF);//0xABFE
[/Quote]
++4
pathuang68 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]

更正上帖
C/C++ code
char a=0xFE;
char b=0xAB;
short c;
c=(((short)b)<<8)|((short)a&0x00FF);//0xABFE
[/Quote]

++3
至善者善之敌 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]
更正上帖
C/C++ code
char a=0xFE;
char b=0xAB;
short c;
c=(((short)b)<<8)|((short)a&0x00FF);//0xABFE
[/Quote]


++2
luciferisnotsatan 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhao4zhong1 的回复:]

C/C++ code
char a=0xFE;
char b=0xAB;
short c;
c=(((short)b)<<8)|((short)a);//0xABFE
[/Quote]
++
赵4老师 2011-08-11
  • 打赏
  • 举报
回复
更正上帖
char   a=0xFE; 
char b=0xAB;
short c;
c=(((short)b)<<8)|((short)a&0x00FF);//0xABFE

赵4老师 2011-08-11
  • 打赏
  • 举报
回复 1
char   a=0xFE; 
char b=0xAB;
short c;
c=(((short)b)<<8)|((short)a);//0xABFE

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧