unsigned short 与 unsigned int

tianwater 2010-12-28 12:34:55
给这个两个类型的变量同样的赋值为-1,结果却不一样。
代码如下:
unsigned short us;

unsigned int un;

us = -1;
printf("\n us = %d\n", us); //输出的是65535

un = -1;
printf("\n un = %d\n", un); //输出的是-1
...全文
1963 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
muteng 2010-12-28
  • 打赏
  • 举报
回复
-1 存储的二进制形式应该是 1111 1111 1111 1111,转成unsigned short后,最高位就不当作符号位处理了,输出 65535 是对的

但是为什么 un 赋值为 -1 后还是输出 -1 就搞不懂了,难道是被强制转换了么……

和LZ一起等待指点……
maoxing63570 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dubiousway 的回复:]
你去掉 unsigned ,就一样了

否则的话,你用%d (输出的是有符号数,和变量类型无关;用%u输出无符号数)输出, 会对short先做扩展(成int类型),再输出
[/Quote]
正解,悲剧了,学C++,忘记了c的格式输出控制了
yuppy 2010-12-28
  • 打赏
  • 举报
回复

unsigned short i = -1;
unsigned int j = -1;

printf("i = %x\n", i);
printf("j = %x\n", j);

output:
ffff
ffffffff
lz懂了?
dubiousway 2010-12-28
  • 打赏
  • 举报
回复
你去掉 unsigned ,就一样了

否则的话,你用%d (输出的是有符号数,和变量类型无关;用%u输出无符号数)输出, 会对short先做扩展(成int类型),再输出
maoxing63570 2010-12-28
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
unsigned short us=-1;
unsigned int un=-1;
cout<<us<<" "<<un<<endl;
system("pause");
return 0;
}

输出结果:65535 4294967295
-1的二进制表示为1111 1111 1111 1111(unsigned short)16位,计算下就知道是65535
1111 1111 1111 1111 1111 1111 1111 1111(unsigned int)32位,计算下就知道是4294967295
没有出现楼主说的情况
dubiousway 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tianwater 的回复:]

关键问题在:
unsigned short us;

printf("\n us = %d\n", us); //输出的是65535
[/Quote]

unsigned short us 是 16位

us= -1 // 也就是 us = 0xffff
printf("\n us = %d\n", us) // %d 的意思,是 us 要当作int 类型输出,int 是32位
所以,us 要先扩展成 int 类型,
相当于:
unsigned short us=-1;//因为 us 是无符号数,所以 -1 表示 最大正整数65535
int i= us;// 因为 us 是无符号数,所以扩展成int 的时候,前面补0,不是补1
printf("\n us = %d\n", i);

----
如果还不明白,看看教材的补码部分
tianwater 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sea313081574 的回复:]
引用 5 楼 muteng 的回复:
-1 存储的二进制形式应该是 1111 1111 1111 1111,转成unsigned short后,最高位就不当作符号位处理了,输出 65535 是对的

但是为什么 un 赋值为 -1 后还是输出 -1 就搞不懂了,难道是被强制转换了么……

和LZ一起等待指点……

这有什么不理解的?
unsigned int un;
un=-1;……
[/Quote]

关键问题在:
unsigned short us;

printf("\n us = %d\n", us); //输出的是65535
sea313081574 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 muteng 的回复:]
-1 存储的二进制形式应该是 1111 1111 1111 1111,转成unsigned short后,最高位就不当作符号位处理了,输出 65535 是对的

但是为什么 un 赋值为 -1 后还是输出 -1 就搞不懂了,难道是被强制转换了么……

和LZ一起等待指点……
[/Quote]
这有什么不理解的?
unsigned int un;
un=-1;其实在存的是11111111 11111111 11111111 11111111这就是-1的补码
这时你用
printf("%d",un);输出要求格式是有符号的int,所有是-1了,如果这时候你用

printf("%u",un);输出,将会是4294967295,也就是32位1了。

69,382

社区成员

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

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