• 全部
  • 问答

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

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



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


高手快快解救我》。。。
...全文
1231 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]
更正上帖
C/C++ code
char a=0xFE;
char b=0xAB;
short c;
c=(((short)b)<<8)|((short)a&0x00FF);//0xABFE
[/Quote]


++2
回复
[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
char   a=0xFE; 
char b=0xAB;
short c;
c=(((short)b)<<8)|((short)a);//0xABFE
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2011-08-11 02:02
社区公告
暂无公告