社区
C++ 语言
帖子详情
关于一道题目的答案
bigbigfans
2006-09-21 10:28:33
题目是有a,b两个变量,不用"if","?:","switch"或其他判断语句,找出两个数中间比较大的
其中一个解
int c = a -b;
char *strs[2] = {"a大","b大"};
c = unsigned(c) >> (sizeof(int) * 8 - 1);
没看懂,请高手帮忙解析!
...全文
338
12
打赏
收藏
关于一道题目的答案
题目是有a,b两个变量,不用"if","?:","switch"或其他判断语句,找出两个数中间比较大的 其中一个解 int c = a -b; char *strs[2] = {"a大","b大"}; c = unsigned(c) >> (sizeof(int) * 8 - 1); 没看懂,请高手帮忙解析!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
haichunzhao
2006-10-10
打赏
举报
回复
懂了!
OOPhaisky
2006-09-23
打赏
举报
回复
还要提醒楼主一个地方,就是虫子提到的地方,unsigned(c) >> (sizeof(int) * 8 - 1)中的“unsigned(c)”转型是必要的,因为如果不是这样的话,c是signed int,那么在移位的时候会有“符号位扩展”,到时候移位的结果将是所有的32位都与最低位相同,即
1111111111111111111111111111111(32个1)
或者
0000000000000000000000000000000(32个0)
前一种情况(32个1)肯定会出问题的。
OOPhaisky
2006-09-23
打赏
举报
回复
int c = a -b;
将a和b作差,结果c的正负号表示a和b的大小,c的符号位(即最高位)为1表示a小于b,c的符号位(即最高位)为0表示a大于b。
char *strs[2] = {"a大","b大"};
strs[0] == "a大";strs[1] == "b大";
c = unsigned(c) >> (sizeof(int) * 8 - 1);
将c右移31位(这里假设int的长度为32位的系统),则c中目前存放的就是原来c的符号位。
最后(个人添加):
cout << strs[c] << endl;
输出结果。
anomone1208
2006-09-23
打赏
举报
回复
支持楼上!
eggqq007
2006-09-23
打赏
举报
回复
强,学习
vigorous001
2006-09-23
打赏
举报
回复
有符号数的移位称为算术移位,无符号数的移位称为逻辑移位。
unsigned(c)逻辑移位,只是补零。
而算术移位既能够补零,也能补一。
Oversense
2006-09-22
打赏
举报
回复
int c = a -b
其实可能会溢出的。
blue_zyb
2006-09-22
打赏
举报
回复
int c = a -b
其实可能会溢出的。
----------------------
步步文说的溢出问题可以通过下面的方式得到修复:
int c = a -b;
char *strs[2] = {"a大","b大"};
c = unsigned(c) >> (sizeof(int) * 8 - 1);
int signa = unsigned(a) >> (sizeof(int) * 8 - 1);
int signb = unsigned(b) >> (sizeof(int) * 8 - 1);
c = (c + ((signa ^signb) && (signa^c) ))%2;
printf("%s\n", strs[c]);
jixingzhong
2006-09-22
打赏
举报
回复
原程序通过 - ,
然后判断结果的符号位,
就得到的所要的比较结果 ....
c = unsigned(c) >> (sizeof(int) * 8 - 1);
注意两点:
1 unsigned, 如果是带符号的, 那么右移的时候可能会在高位带入1, 与预期不符合
2 sizeof(int) * 8 - 1, 右移的位数, 是数据位数-1, 这样就只是剩下了最高位
jixingzhong
2006-09-22
打赏
举报
回复
溢出可能是有的,
但是一般来说问题不大,
这个只是小问题 ...
a_b_c_abc1
2006-09-21
打赏
举报
回复
int a=-10,b=10;
int c = a -b; ///如果a大于b,则c为正,否则为负(2进制最高位为1)
char *strs[2] = {"a大","b大"};
c = unsigned(c) >> (sizeof(int) * 8 - 1); //如果int为2字节,就按无符号数右移15位
//如果int为4字节,就按无符号数右移31位,结果就得到C的2进制最高位1或0.
printf(strs[c]);//所以下一句这样就可以了。
cunsh
2006-09-21
打赏
举报
回复
c = unsigned(c) >> (sizeof(int) * 8 - 1);
c = c的最高位(符号位)啊
数字电子技术基础期末考试习题及
答案
数字电子技术基础期末考试习题及
答案
很好的考前复习资料 有需要者请下载
2015年下半年软件设计师真题和
答案
(上午和下午算法题
上午
题目
和
答案
完全,可信! 下午题有
一道
完整的算法题和参考
答案
上海2020年事业编招聘考试真题及
答案
解析网友整理版.docx
上海2020年事业编招聘考试真题及
答案
解析网友整理版.docx
明水事业编招聘2020年考试真题及
答案
解析下载版.docx
明水事业编招聘2020年考试真题及
答案
解析下载版.docx
昆一中2文数
答案
.doc
昆一中2文数
答案
.doc
C++ 语言
65,184
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章