关于一道题目的答案

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);
没看懂,请高手帮忙解析!
...全文
320 12 打赏 收藏 转发到动态 举报
写回复
用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的最高位(符号位)啊

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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