C语言中无符号数和有符号数之间的比较和运算
学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语言中无符号数和有符号数之间的比较和运算相关推荐
- java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算
C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...
- C语言中无符号数和有符号数相加问题
看个题: #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); ...
- C++中无符号数与有符号数的转换
C++中的无符号数与有符号数的转换 1.无符号数转为有符号数 unsigned short int a = 50000;signed short int b = 0;b = a;cout <&l ...
- 无符号数和有符号数之间赋值和大小比较
unsigned int a = -1; printf("a = %d", a); printf("a = %u", a); int b = 301234567 ...
- C90标准中无符号数与有符号数的比较以及原因解释(关系式-2147483648<2147483647结果为假)
在C90标准下进行编译并执行: gcc -o num -g num.c 可以看到如上结果,第一个结果看起来非常不符合常识为什么-2147483648<2147483647得到的结果是0即fals ...
- 无符号数跟有符号数之间暗藏杀机
无符号和有符号之前暗藏杀机你get到了吗,不要在遇到坑了 一.直接上代码 大家看看这段代码有什么错误吗? float sum_elements(float a[], unsigned length) ...
- 无符号数、有符号数、补码在汇编中的运用及相关注意事项
1.原码.反码.补码知识的复习: 三者的最高位均为符号位.我以前一直没弄明白的是为何8位补码的表示范围是-128~127,今天查阅了相关资料,于此记下. 仍然以8位为例: 原码的表示范围:-127~- ...
- C语言无符号数与有符号数的运算原则
int main(void) {for (int i = -1; i < sizeof(int); i++) {printf("%d\n", i);}return 0; } ...
- 《C++ Primer 第五版》(第4.11节类型转换) ————关于无符号数和有符号数的运算探究
1.关于无符号数和有符号数的运算 关于无符号数和有符号数的运算,在我看来一直是觉得只要有无符号数和有符号数的运算,有符号数就转化为无符号数,但是在<C++ Primer 第五版>的p142 ...
最新文章
- linux shell 的 for 循环
- JSPServlet学习手册
- 简单实现ibatis的物理分页
- 1-3 数组的反序输出
- linux shell之cut命令
- linux在线更新curl,Linux:curl
- win7磁盘清理_为什么要清理磁盘碎片,win7电脑怎么清理磁盘碎片
- 苹果确认部分AirPods Pro存在静电噪音等声音问题 将免费更换
- Linux环境下虚拟化之KVM常用命令
- elasticsearch sort illegal_argument_exception error
- Javascript实践-Function对象扩展之延时执行函数
- python实现FTP文件上传
- 计算机二级考试是可以任选一种吗,计算机二级考试内容是什么_可以任意选择吗...
- 程序员必知的 89 个操作系统核心概念
- 读 孙卫琴《Tomcat与Javaweb开发技术详解》
- 电梯口的美团外卖与饿了么
- Houdini地形创建
- 什么人不可以喝普洱熟茶?
- CSMA/CD 协议 详解
- proteus7【硬件课程设计】
热门文章
- 今天玩了一款游戏,真不错哦,英文的
- vivos9更改控制中心样式(修改方法分享)
- 关于 promise链式调用与中止
- QQ浏览器彻底卸载方式
- 商汤科技招聘全职研究员和实习生
- 论文审稿意见太奇葩?NeurIPS 2021:把它曝光出来给人看
- 二维码生成插件qrious(纯JS)
- ppt模板如何制作个性海报?
- 踩坑记---VSCode--It seems that the gevent monkey-patching is being used. Please set an environment ...
- 交通数字孪生高速公路规划设计市政道路BIM正向改扩建设计利用实景三维无人机机载LiDAR倾斜摄影车载地面三维激光扫描仪LiDAR点云数据提取自动驾驶高精地图三维矢量车道标线3d点云标注