C语言的unsigned做双目运算符的奇怪问题
首先看代码:
#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。。。
C语言的unsigned做双目运算符的奇怪问题的更多相关文章
- 为什么选择Go语言 GO语言都能做什么产品
Go语言,又称Golang,是Google开发的一款静态强类型.编译型.并发型,并具有垃圾回收机制的编程语言,它的运行速度非常之快,同时还有如下特性:具有一流的标准库.无继承关系.支持多核:同时它还有 ...
- Unity3D研究之多语言用中文做KEY
做多语言的时候用中文做KEY绝对是有100%的优点,假设用英文表示那么代码里面给文字赋值的地方全都是英文.写的代码多了以后维护起来就没有人能看懂了,或者看起来非常费劲. 对PoolManager ...
- 学了 C 语言到底能做什么, 能从事什么工作?
前言 经常有小伙伴问我,你是做C/C++的,那学C语言可以做什么呢?尤其是还在学校的同学,感觉自己学了很久,什么也做不了,一度怀疑自己是不是不适合程序员这个方向. 开始我都是直接说可以开发嵌入式啊,做 ...
- 深入理解C语言-结构体做函数参数
结构体做函数参数,在C语言中属于常见现象,此时为了内存考虑,不传递结构体,而是传递结构体的地址 结构体定义 struct Man { char name[64]; int age; }; 结构体可以与 ...
- C语言中数组做函数参数的问题
数组做函数参数,会退化成为一个指针变量.因此在进行数组参数传递的同时,需要传递一个数组长度的参数变量. 数组长度可以通过sizeof(arr)/siezof(arr[0])来得到.关于这个sizeof ...
- C-基础:C语言为什么不做数组下标越界检查
//这段代码运行有可能不报错.]; ;i<;i++) { a[i]=i; } 1.为了提高运行效率,不检查数组下表越界,程序就可以跑得快.因为C语言并不是一个快速开发语言,它要求开发人员保证所有 ...
- .Net程序员之不学Java做安卓开发:奇怪的Java语法
1.final关键字:用以修饰类时,表示类不可以被继承,指向基本数据类型或者引用类型时,该类只可以在声明的时候初始化 2.@Override 类似C# 中override关键字,表示对父类的重写.网上 ...
- C语言的数据类型
复习之余,做点笔记<C语言之数据类型> 一.整数数据类型 (1)整数数据类型 整数类型 char 字符型变量 1字节(8Bit) short 短整型 2字节(16Bit) i ...
- C语言介绍
以下东东转自百度百科 C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.它由美国贝尔实验室的Dennis M. Ritchie于1972年推出,1978年后,C语言已先后被 ...
随机推荐
- Linux - 加密打包
tar 加密打包 压缩 tar -czvf /path/to/file.tar.gz file 解压 tar -xzvf /path/to/file.tar.gz /path/to 加密压缩 tar ...
- 【React自制全家桶】二、分析React的虚拟DOM和Diff算法
一.React如何更新DOM内容: 1. 获取state 数据 2. 获取JSX模版 3. 通过数据 +模版结合,生成真实的DOM, 来显示,以下行代码为例(简称代码1) <div id= ...
- 数据库CASE 函数 时间用法
select * from warehouse_trade_detail whereb_createtime>= cast('2016-01-01' as date) and b_createt ...
- SQL学习(七)试图
试图是基于SQL语句的结果集的可视化表. 1.创建试图 create view 试图名 as select 语句 如: create view ticketresult as select * fro ...
- JavaScript(3):JSON
<!DOCTYPE html> <html> <body> <p>JSON</p> <script> // JSON 值可以是: ...
- 认识一下 Kafka
Kafka 基本概述 什么是 Kafka Kafka 是一个分布式流式平台,它有三个关键能力 订阅发布记录流,它类似于企业中的消息队列 或 企业消息传递系统 以容错的方式存储记录流 实时记录流 Kaf ...
- 怎样将DataGrip连接到MS SQL Server?
DataGrip支持几乎所有主流的关系数据库产品,如DB2.Derby.H2.MySQL.Oracle.PostgreSQL.SQL Server.Sqllite及Sybase等,并且提供了简单易用的 ...
- Java ——注释 命名
注释 1.类在每个类前面必须加上类注释,注释模板如下:/*** Copyright (C), 2006-2010, ChengDu Lovo info. Co., Ltd.* FileName: Te ...
- python基础知识(字符串)
定义字符串 ' '单引号 " "双引号 只能用于单行 '" '"三引号 可以用于多行 拼接字符串使用 +号链接 字符串只能链接字符串其他类型字符串需要用s ...
- Python爬虫学习==>第十二章:使用 Selenium 模拟浏览器抓取淘宝商品美食信息
学习目的: selenium目前版本已经到了3代目,你想加薪,就跟面试官扯这个,你赢了,工资就到位了,加上一个脚本的应用,结局你懂的 正式步骤 需求背景:抓取淘宝美食 Step1:流程分析 搜索关键字 ...