社区
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);
没看懂,请高手帮忙解析!
...全文
320
12
打赏
收藏
关于一道题目的答案
题目是有a,b两个变量,不用"if","?:","switch"或其他判断语句,找出两个数中间比较大的 其中一个解 int c = a -b; char *strs[2] = {"a大","b大"}; c = unsigned(c) >> (sizeof(int) * 8 - 1); 没看懂,请高手帮忙解析!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的最高位(符号位)啊
《计算机网络自顶向下(第七版)》课后题最全
答案
-含
题目
《计算机网络自顶向下(第七版)》课后题
答案
中英文版
答案
的汇总,涵盖了所有的
题目
,每
一道
题都有
答案
,大部分为中文
答案
,其余为英文
答案
,但能够保证包含所有
题目
答案
。同时每道题都是
题目
+
答案
的格式,
题目
为英文
题目
,更有助于学习。 最后还夹带了中英文专有词汇对照表以及一些复习题。 资源不需要积分就能下载,麻烦点个关注,主页还有更多文章和资源。
一道
C#编程题与
答案
一道
简单的C#题,里面有两种解题的方法,希望初学的同学一起探讨一下。
每
一道
试题都是有解题密码(2018年下半年信息系统项目管理师试题讲解)
小虎讲解2018下半年信息系统项目管理师综合知识试题。 学习变得有趣,学习的知识,记得牢,让考试变得简单。 让考生顺利通过信息系统项目管理师的考试,获得高级资格证书。
计算机二级python真题题库(
题目
+
答案
)电子版笔记2
本资源包含历年来计算机二级python真题题库(
题目
+
答案
)电子版笔记1,共15套真题,80道习题及2套练习题。计算机二级python考试的大部分内容都十分基础,可以帮助初学者用来入门Python。考试有40分的单选题、60分的操作题。其中单选题是公共基础题(10分,包括计算机基础、数据结构与算法等相关知识)及Python基础相关的
题目
(30分,包括python基本语法规则、安装方法、第三方库等相关知识)。 最重要的其实就是操作题,操作题就是给定一定的情景环境,让考生编写相应代码。操作题一共有六大题,包括3道基本操作题(各5分)、2道简单应用题(分别10、15分)和
一道
综合应用题(20分)。其中基本操作提多以填空形式出现较为简单,应用题多考察一些常用函数,综合应用题难度较大,需要重点练习一下! 如果有小伙伴刚好想要入门这门语言的话,顺带考个证书会是个不错的选择~
2015年下半年软件设计师真题和
答案
(上午和下午算法题
上午
题目
和
答案
完全,可信! 下午题有
一道
完整的算法题和参考
答案
C++ 语言
64,639
社区成员
250,578
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章