「题解」关于sizeof陷阱,无符号整形,变种水仙花数

简介: x是有符号数-1,内存中是全1,当有符号的x和无符号数进行比较时,x会隐式类型转换被当做无符号数,是一个很大的数,输出结果是x is greater至于这个很大的数是偶少呢

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

sizeof陷阱以及无符号整形

让我们看一下这段代码:

1.  int main(){
2. int x = -1;
3. unsigned int y = 2;
4. if (x > y){
5. printf("x is greater");
6. }
7. else{
8.     printf("y is greater");
9. }
10. return 0;
11. }

大家会认为结果是多少呢?结果会是"y is greater"?让我们看一下运行结果吧

FE7F295D-82AC-407B-94F0-5AE529837FFD.jpeg

为什么会出现这种结果呢,由于x是有符号数-1,内存中是全1,当有符号的x和无符号数进行比较时,x会隐式类型转换被当做无符号数,是一个很大的数,输出结果是x is greater

至于这个很大的数是偶少呢

1. int x=-1    原码:10000000000000000000000000000001
2.             反码:11111111111111111111111111111110
3.             补码:11111111111111111111111111111111
4. unsigned int x=-1    补码:11111111111111111111111111111111
5. 没有符号则             原码等于补码:11111111111111111111111111111111
6. unsigned int y=2     原码:00000000000000000000000000000010
7. 注意:此时x,y都是无符号数,二进制码的最高位不是符号位。
8. 肉眼可见11111111111111111111111111111111>00000000000000000000000000000010
9. 所以x>y

还有一道题异曲同工

1. #include <stdio.h>
2. int i;
3. int main(){
4.     i--;
5. if (i > sizeof(i)){
6.         printf(">\n");
7.     }
8. else{
9.         printf("<\n");
10.     }
11. return 0;
12. }

C语言中,0为假,非0即为真。

全局变量,没有给初始值时,编译其会默认将其初始化为0。i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,所以输出‘>’

这道题其实很隐蔽,真是虾仁猪心!!!

注:sizeof的返回值类型实际为无符号整形,如果有符号的整形数据与无符号整形的数据比较时,无符号整形的数据自动转换为无符号整形的数据

sizeof运行规则

一般表达式的运算是在运行时执行的,而sizeof是一个编译阶段就执行的运算符,在其内的任何运算都不执行。

1. #include <stdio.h>
2. int main()
3. {
4. int i = 1;
5. sizeof(i++);
6. printf("%d\n", i);
7. return 0;
8. }
9. 一般表达式的运算是在运行时执行的,而sizeof是一个编译阶段就执行的运算符,在其内的任何运算都不执行
10. 所以i++是不会计算的,++i同样也是不会计算的,所以i的值还是等于1

变种水仙花数

变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。

例如:

655 = 6 * 55 + 65 * 5

1461 = 1*461 + 14*61 + 146*1

输入描述:无

输出描述:一行,5位数中的所有 Lily Number,每两个数之间间隔一个空格

1. #include<stdio.h>
2. #include<math.h>
3. int main(){
4. for(int i=10000;i<99999;i++){
5. int sum=0;
6. for(int j=1;j<=4;j++){
7. int a=0,b=0;
8. a=i%(int)pow(10,j);
9. b=i/pow(10,j);
10. sum+=a*b;
11. }
12. if(i==sum){
13. printf("%d ",i);
14. }
15. }
16. return 0;
17. }

解题思路:

1. 12345
2. 1*2345+12*345+123*45+1234*5
3. 首先我们得这个五位数拆分成4对数据,
4. int a=0,b=0;
5. a=i%(int)pow(10,j);
6. b=i/pow(10,j);
7. 用局部变量a,b分别去保存这一对数据,用局部变量sum保存a*b的值,经历4次循环,sum累加后的值与本身这个数比较,就可以判断出是否是变种的水仙花数

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  



相关文章
|
3月前
|
人工智能 自然语言处理 运维
阿里云 X 瓴羊:AI Stack一体机上新解决方案,重构企业问数与客服交互
简介:瓴羊基于阿里云AI Stack推出智能问数与智能客服一体机,以“低成本、零门槛”实现数据分析与客服效率的显著提升,助力企业智能化升级。
367 0
|
9月前
|
供应链 数据挖掘 BI
1688 买家订单,订单物流,订单回传接口系列(1688 寻源通 API)
1688作为国内领先的批发采购平台,提供了买家订单、订单物流及订单回传三大API接口,助力企业实现订单管理、物流跟踪和信息反馈的自动化。通过这些接口,企业可以获取订单详情、物流状态,并将处理结果回传至平台,提升运营效率。Python示例代码展示了如何使用这些接口进行数据交互,适用于电商内部管理、物流跟踪及数据分析等场景。
探索网络安全:浅析文件上传漏洞
网络安全是一场没有硝烟的战争,它要求我们时刻保持警惕,不断学习与适应。无论是采用强密码、数据加密,还是定期更新软件、安装安全软件,每一项措施都是我们构建网络安全防线的基石。同时,我们也应意识到,技术手段之外,提升安全意识、培养安全习惯同样至关重要。
|
SQL 关系型数据库 MySQL
这个错误可能是由于Flink CDC在处理MySQL和SQL Server之间的数据同步时遇到了问题
这个错误可能是由于Flink CDC在处理MySQL和SQL Server之间的数据同步时遇到了问题
215 1
|
算法 JavaScript 测试技术
vue3源码分析——实现组件更新
vue3在更新element的时候,除了需要分情况讨论更新children外,还需要来看vue3的属性有没有变化;那么同样的道理,对于组件的更新,也是需要来更新属性,插槽等
vue3源码分析——实现组件更新
|
JavaScript 前端开发 索引
|
API 调度 Python
Python 异步: 创建和运行异步任务(7)
您可以从 asyncio 程序中的协程创建任务对象。任务提供独立调度和运行的协程的句柄,并允许查询、取消任务,以及稍后检索结果和异常。异步事件循环管理任务。因此,所有协程都成为事件循环中的任务并作为任务进行管理。
|
JSON JavaScript 前端开发
学习AJAX必知必会(5)~同源策略、解决跨域问题(JSONP、CORS)
学习AJAX必知必会(5)~同源策略、解决跨域问题(JSONP、CORS)
316 0
学习AJAX必知必会(5)~同源策略、解决跨域问题(JSONP、CORS)
|
安全 Java 关系型数据库