请叫个小问题.. short 和 unsigned short 到底区别在哪里?

wangchendh 2011-06-10 04:56:31

我想定义一个2个字节的变量a;把a的16进制形式到字符串str中。
比如 a = -2, str = FFFE;

void main()
{
short a = -2;
// 结果为FFFFFFFE
// 此处改成 unsigned short a = -2; 结果FFFE
// 为什么?
char str[256] = {0};
sprintf(str,"%04x",a);

printf("%s",str);
}
...全文
1920 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wizard_tiger 2011-06-12
  • 打赏
  • 举报
回复
有符号的整数表示一般使用补码。
改成无符号整数表示。
lifeng000 2011-06-10
  • 打赏
  • 举报
回复
9楼正解
c语言里的符号扩展相关的事宜可以说是特别麻烦的,从来没有记住过
wangchendh 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 abbey 的回复:]

引用 10 楼 wangchendh 的回复:

引用 8 楼 abbey 的回复:

值域 (-128, 127) 与 (0,255)的区别


跟这个有什么关系?一个4个字节 一个2个字节.........都是-2

之前记成byte了。更正如下:

short与unsigned short都是16位,但是unsign short是所有16位都作为数据位,这样值域是0……
[/Quote]
为什么 unsigned short a = -2; 结果FFFE?跟 定义 short a = -2; 结果不一样?
wangchendh 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luciferisnotsatan 的回复:]

一个有符号,一个无符号。
%04x 不能用这个看,这个是作为int型显示的。
打断点,用调试器看
[/Quote]
好像你说的比较有道理....
wangchendh 2011-06-10
  • 打赏
  • 举报
回复
感谢楼上几位.......问题已经找到.....跟值域没关系...
老毕 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangchendh 的回复:]

引用 8 楼 abbey 的回复:

值域 (-128, 127) 与 (0,255)的区别


跟这个有什么关系?一个4个字节 一个2个字节.........都是-2
[/Quote]
之前记成byte了。更正如下:

short与unsigned short都是16位,但是unsign short是所有16位都作为数据位,这样值域是0到65535。而short是1个符号位+15个数据位,值域是−32768 到 32767
5t4rk 2011-06-10
  • 打赏
  • 举报
回复
这个楼主你自己在你的机子上调试一下就知道了
其实区别就是表示的范围不一样了。
一个带符号,一个不带的。
wangchendh 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 abbey 的回复:]

值域 (-128, 127) 与 (0,255)的区别
[/Quote]

跟这个有什么关系?一个4个字节 一个2个字节.........都是-2
wangchendh 2011-06-10
  • 打赏
  • 举报
回复
找到答案了
-----------------------------
这里要注意一个符号扩展的问题:比如,假如我们想打印短整数(short)-1 的内存16 进制表示形式,在Win32 平台上,一个short 型占2 个字节,所以我们自然希望用4 个16 进制数字来打印它:
short si = -1;
sprintf(s, \"X\", si);
产 生“FFFFFFFF”,怎么回事?因为spritnf 是个变参函数,除了前面两个参数之外,后面的参数都不是类型安全的,函数更没有办法仅仅通过一个“%X”就能得知当初函数调用前参数压栈时被压进来的到底 是个4 字节的整数还是个2 字节的短整数,所以采取了统一4 字节的处理方式,导致参数压栈时做了符号扩展,扩展成了32 位的整数-1,打印时4 个位置不够了,就把32 位整数-1 的8 位16 进制都打印出来了。

如果你想看si 的本来面目,那么就应该让编译器做0 扩展而不是符号扩展(扩展时二进制左边补0 而不是补符号位):
sprintf(s, \"X\", (unsigned short)si);
就可以了。或者:
unsigned short si = -1;
sprintf(s, \"X\", si);
-----------------------------
老毕 2011-06-10
  • 打赏
  • 举报
回复
值域 (-128, 127) 与 (0,255)的区别
wangchendh 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luciferisnotsatan 的回复:]
一个有符号,一个无符号。
%04x 不能用这个看,这个是作为int型显示的。
打断点,用调试器看
[/Quote]
那用啥么?
wangchendh 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shi3590 的回复:]
符号位啊符号位。。
[/Quote]
能不能说的清楚点?最左一位都是1 都是符号位,FFFFFFFE与 FFFE 值是一样的,只是字节上不一样吧?
luciferisnotsatan 2011-06-10
  • 打赏
  • 举报
回复
一个有符号,一个无符号。
%04x 不能用这个看,这个是作为int型显示的。
打断点,用调试器看
fo1_sky 2011-06-10
  • 打赏
  • 举报
回复
一个可以表示负值,一个只能表示正值
shi3590 2011-06-10
  • 打赏
  • 举报
回复
符号位啊符号位。。
wangchendh 2011-06-10
  • 打赏
  • 举报
回复
short a = -2; 这个不也是2个字节?为什么结果是FFFFFFFE?
shi3590 2011-06-10
  • 打赏
  • 举报
回复
unsigned short 0~65536
unsigned short a = -2; //a=65534=FFFE

33,320

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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