C语言的unsigned做双目运算符的奇怪问题
2024-10-07 02:23:49
首先看代码:
#include <stdio.h> void main()
{
int num1 = ;
unsigned int num2 = ;
if (num1 - num2 > )
{
printf("%d-%d=%d,大于0", num1, num2, num1 - num2);
}
else
{
printf("%d-%d=%d,小于0", num1, num2, num1 - num2);
}
}
以为会输出这个结果:
1-2=-1,小于0
错了。。运行结果如下
1-2=-1,大于0
再看C#的的运算结果
static void Main(string[] args)
{
int num1 = ;
uint num2 = ;
if (num1 - num2 > )
{
WriteLine($"num1-num2={num1 - num2},大于0");
}
else
{
WriteLine($"num1-num2={num1 - num2},小于0");
}
Console.ReadKey();
}
输出结果:
num1-num2=-1,小于0
C#的运算结果与期待结果一致。
原来C语言在做两个数加减的时候,是按照其中一个更严格的数据类型来计算的。所以当int和unsigned int运算的时候,会转换为unsigned int来运算。
printf("%d-%d=%d,大于0", num1, num2, num1 - num2);
//将上面的的代码修改为
printf("%d-%d=%u,大于0", num1, num2, num1 - num2);
得到输出结果:
1-2=4294967295,大于0
4294967295太大了不方便分析,我们将它转换为16进制:FFFFFFFF,刚好是-1的补码。。
所以if语句中的num1-num2,得出来的是num1-num2的补码也就是FFFFFFFF,满足大于0。。。
最新文章
- Codeforces Round #234A
- NGUI 滑动与点击事件冲突处理
- 【题解】【区间】【二分查找】【Leetcode】Insert Interval &; Merge Intervals
- [复变函数]第06堂课 2.1 解析函数的概念与 Cauchy-Riemann 方程 (续)
- hdu 六度分离 floyd
- C 再识数组指针 指针数组的概念
- wireshark使用心得
- python注意事项
- 《Python 数据库 GUI CGI编程》
- 【相关网站 - 01】- Java 相关网站
- Filter需要配置多个url-pattern
- spring载入外部配置文件的方法
- python通过get,post方式发送http请求和接收http响应的方法,pythonget
- mysql学习【第4篇】:MySQL函数和编程
- .net连mysql数据库汇总
- java基础-System类常用方法介绍
- wp中的位图
- 【C#】【MySQL】C# 查询数据库语句@Row:=@Row+1以及执行存储过程失败解决方案
- 总结js(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作
- oracle错误一览表
热门文章
- 代码实现:键盘录入一个int类型的整数,对其求二进制表现形式
- WCF绑定(Binding)
- nodejs相关
- LoadRunner 技巧之协议分析
- Ubuntu16.04系统Tensorflow源码安装
- Python爬虫学习==>;第十二章:使用 Selenium 模拟浏览器抓取淘宝商品美食信息
- win10相机打不开,显示错误代码0xA00F4246(0x800706D9)
- 统计学习方法 | 第1章 统计学习方法概论 | Scipy中的Leastsq()
- [python] 正则表达式细节
- 1. centos7 的安装