学C语言的同学看看以下代码运行结果会多少

源代码

#include <stdio.h>
void main(void)
{unsigned char uchar_num = 1;char schar_num = -2;unsigned int uint_num = 1;int sint_num = -2;printf("unsigned char 1 > char -2 \t= %d \r\n", (uchar_num > schar_num));printf("unsigned int 1 > int -2 \t= %d \r\n", (uint_num > sint_num));printf("unsigned char 1 > int -2 \t= %d \r\n", (uchar_num > sint_num));printf("unsigned int 1 > char -2 \t= %d \r\n", (uint_num > schar_num));printf("unsigned char 1 + int -2 \t= %d \r\n", uchar_num + sint_num);printf("unsigned int 1 + int -2 \t= %d \r\n", (uint_num + sint_num));if((uint_num + sint_num) > 0)printf("unsigned int 1 + int -2 \t大于0\r\n");elseprintf("unsigned int 1 + int -2 \t小于0\r\n");
}

运行结果, 看看有没有和自己意想不到的结果。

unsigned char 1 > char -2     = 1 unsigned int 1 > int -2     = 0 unsigned char 1 > int -2    = 1 unsigned int 1 > char -2    = 0 unsigned char 1 + int -2  = -1 unsigned int 1 + int -2  = -1 unsigned int 1 + int -2  大于0[Finished in 0.1s]

亡羊补牢,基本功夯实中

出现迷糊的同学应该是这两点没搞清楚,请熟记以下两点:

1、有符号数和无符号数混合运算时(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,返回无符号数结果

2、32位机器中,比int小的整型(包括short 、unsigned short 、 unsigned char和char)在运算中都要转换成int然后进行运算

掌握以上两条准则再回头看前面运行的结果是不是觉得就合理了。

至于为什么选择转换为int,应该是从效率上考虑的,因为通常情况下int的长度被定义为机器处理效率最高的长度,比如32位机

上,一次处理4个字节效率是最高的,所以虽然short(我机器上占2个字节)更节省内存,但是在运算中的效率,是int更高。

总结

混合计算时,非int型需要转换成有符号int型,原本就有unsigned int时,其他类型全部转成unsigned int后参与计算

辅助记忆的例子:

if(u32 a = 1 > s8 b = -2)

返回就是false

分析:有非int型 s8 b需要转换成s32 b,又因为有u32参与计算,s32 b又需要被转换成u32 b = 0xffff ffff ffff fffe

C语言中无符号数和有符号数之间的比较和运算相关推荐

  1. java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...

  2. C语言中无符号数和有符号数相加问题

    看个题: #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); ...

  3. C++中无符号数与有符号数的转换

    C++中的无符号数与有符号数的转换 1.无符号数转为有符号数 unsigned short int a = 50000;signed short int b = 0;b = a;cout <&l ...

  4. 无符号数和有符号数之间赋值和大小比较

    unsigned int a = -1; printf("a = %d", a); printf("a = %u", a); int b = 301234567 ...

  5. C90标准中无符号数与有符号数的比较以及原因解释(关系式-2147483648<2147483647结果为假)

    在C90标准下进行编译并执行: gcc -o num -g num.c 可以看到如上结果,第一个结果看起来非常不符合常识为什么-2147483648<2147483647得到的结果是0即fals ...

  6. 无符号数跟有符号数之间暗藏杀机

    无符号和有符号之前暗藏杀机你get到了吗,不要在遇到坑了 一.直接上代码 大家看看这段代码有什么错误吗? float sum_elements(float a[], unsigned length) ...

  7. 无符号数、有符号数、补码在汇编中的运用及相关注意事项

    1.原码.反码.补码知识的复习: 三者的最高位均为符号位.我以前一直没弄明白的是为何8位补码的表示范围是-128~127,今天查阅了相关资料,于此记下. 仍然以8位为例: 原码的表示范围:-127~- ...

  8. C语言无符号数与有符号数的运算原则

    int main(void) {for (int i = -1; i < sizeof(int); i++) {printf("%d\n", i);}return 0; } ...

  9. 《C++ Primer 第五版》(第4.11节类型转换) ————关于无符号数和有符号数的运算探究

    1.关于无符号数和有符号数的运算 关于无符号数和有符号数的运算,在我看来一直是觉得只要有无符号数和有符号数的运算,有符号数就转化为无符号数,但是在<C++ Primer 第五版>的p142 ...

最新文章

  1. linux shell 的 for 循环
  2. JSPServlet学习手册
  3. 简单实现ibatis的物理分页
  4. 1-3 数组的反序输出
  5. linux shell之cut命令
  6. linux在线更新curl,Linux:curl
  7. win7磁盘清理_为什么要清理磁盘碎片,win7电脑怎么清理磁盘碎片
  8. 苹果确认部分AirPods Pro存在静电噪音等声音问题 将免费更换
  9. Linux环境下虚拟化之KVM常用命令
  10. elasticsearch sort illegal_argument_exception error
  11. Javascript实践-Function对象扩展之延时执行函数
  12. python实现FTP文件上传
  13. 计算机二级考试是可以任选一种吗,计算机二级考试内容是什么_可以任意选择吗...
  14. 程序员必知的 89 个操作系统核心概念
  15. 读 孙卫琴《Tomcat与Javaweb开发技术详解》
  16. 电梯口的美团外卖与饿了么
  17. Houdini地形创建
  18. 什么人不可以喝普洱熟茶?
  19. CSMA/CD 协议 详解
  20. proteus7【硬件课程设计】

热门文章

  1. 今天玩了一款游戏,真不错哦,英文的
  2. vivos9更改控制中心样式(修改方法分享)
  3. 关于 promise链式调用与中止
  4. QQ浏览器彻底卸载方式
  5. 商汤科技招聘全职研究员和实习生
  6. 论文审稿意见太奇葩?NeurIPS 2021:把它曝光出来给人看
  7. 二维码生成插件qrious(纯JS)
  8. ppt模板如何制作个性海报?
  9. 踩坑记---VSCode--It seems that the gevent monkey-patching is being used. Please set an environment ...
  10. 交通数字孪生高速公路规划设计市政道路BIM正向改扩建设计利用实景三维无人机机载LiDAR倾斜摄影车载地面三维激光扫描仪LiDAR点云数据提取自动驾驶高精地图三维矢量车道标线3d点云标注