前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >-1大于1,-1乘3不等于-3,C语言这个规则你必须得会!

-1大于1,-1乘3不等于-3,C语言这个规则你必须得会!

作者头像
Power7089
修改于 2020-07-28 09:20:06
修改于 2020-07-28 09:20:06
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

哈喽,大家好。今天我们由C语言的一个经典题目入手,跟大家聊聊C语言一个非常重要的规则,不要着急,让我们从-1大于1的例子说起。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

unsigned int i=1;
signed int j=-1;

很简单,无符号数i,有符号数j,比较i和j的大小,按照常理i是大于j的,但是实验证明j>i,也就是说-1>1,为什么会这样呢?

其实出现这个情况的原因就是C语言中的自动转换原则,这也是今天我们想给大家说的话题。在C语言中,若遇到无符号数和有符号数之间的操作,这时候会出现数据类型的提升现象,编译器会自动把有符号数转化为无符号数来进行处理,因此i是1没错,但j却不是-1了,而是变成了 4294967295。所以j>i了。

关于数据为何是4294967295,我们今天从数学的角度给大家分析一下,供大家参考。

首先大家知道无符号数unsigned int的表示范围是:[0 4294967295 ]= [0 2147483647] U [2147483648 4294967295],数学上称为值域。而有符号数int的值域是 [-2147483648—2147483647]。两个区间的元素个数都是4294967296个。

由此看出,二者的公共域是[0 2147483647],所以有符号数int的[-2147483648 -1] 对应 unsigned int的[2147483648 4294967295],这种一一对应的关系,数学上叫做映射。到这里,数据的对应关系就一目了然了, -1 自然对应的就是 4294967295了。

由-1大于1的例子,我们对C语言的自动转换原则进行简单总结。

一般来说,C语言存在4种情况的自动转换,也称为隐式转换。

1、算术运算式中,低级类型转换为高级类型。 (下面的图对低级和高级进行了说明,大家可以参考)

2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。

3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。

4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。

当然,以上情况只是进行了一般的总结,有些细节还没有提到,比如字符必须先转换为整数,short必须转换为int,float型数据在运算时必须转换为double来提高运算精度等等,有兴趣的可以自行去了解学习。

了解自动转换原则后,我们再来看这个微软面试题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
int main(void)
{
  unsigned int i=3;
  cout<<i * -1;
  return 0;
 }

问结果会输出什么?有人说不是3而应该是12884901885,因为发生了隐式转换。其实本题的答案是4294967293,哪里有问题呢?我们一步一步分析,有符号数-1与无符号数3进行算数运算,-1变为无符号数4294967295,再乘3得12884901885。到这里都没问题,但是有一点很多人忽略了:那就是无符号数unsigned int只能表示32位,而此时的结果发生了溢出!因此结果是4294967293。

最后,关于本题这里有一点,因为上述代码是C++,大家可以改写成C语言,用printf来输出,再看看运行结果,你会有新的发现哦!好啦,就写到这里吧,希望今天的文章对大家的学习有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员阿甘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字
IT可乐
2018/01/04
1.9K0
深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字
操作符详解(这么详细的操作符介绍你确定不看一看?)【C语言】【附试题详解】
操作符的分类:算数操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、(下标引用、函数调用和结构成员)。
see.
2024/06/04
1220
操作符详解(这么详细的操作符介绍你确定不看一看?)【C语言】【附试题详解】
C语言入坑指南-整型的隐式转换与溢出
我们知道整型有无符号数和有符号数之分。如果我们对无符号数和有符号数处理不当,就可能造成难以预测的结果,尤其是在作为循环条件的时候,可能导致死循环。整型之间的运算还可能导致出现另外一个问题-溢出。本文将分别介绍它们。
编程珠玑
2019/09/03
2.9K0
C语言入坑指南-整型的隐式转换与溢出
【C语言】数据类型和变量详解
C语言为了描述世界里丰富的数据提供了许多种的数据类型,现在我们来详细介绍一下
TANGLONG
2024/10/15
4010
【C语言】数据类型和变量详解
【C语言篇】C语言常考及易错题整理DAY3
基本数据类型的等级从低到高如下:char int long float double运算的时候是从低转到高的,表达式的类型会自动提升或者转换为参与表达式求值的最上级类型
半截诗
2024/10/09
860
初识C语言
自己整理的C语言基础学习笔记,参考了挺多资料的,适合梳理知识框架,进而攻克各个知识点。
小孙同学
2022/01/14
3950
初识C语言
农民工学CSAPP题目解析-前篇题目解答以及答疑总结
特别鸣谢:木芯工作室 孔子学鼓琴师襄子,十日不进。师襄子曰:“可以益矣。”孔子曰:“丘已习其曲矣,未得其数也。”有间,曰:“已习其数,可以益矣。”孔子曰:“丘未得其志也。”有间,曰:“已习其志,可以益矣。”孔子曰:“丘未得其为人也。”有间,有所穆然深思焉,有所怡然高望而远志焉。曰:“丘得其为人,黯然而黑,几然而长,眼如望羊,如王四国,非文王其谁能为此也!”师襄子辟席再拜,曰:“师盖云文王操也。”
20岁爱吃必胜客
2022/11/13
2980
农民工学CSAPP题目解析-前篇题目解答以及答疑总结
c/c++基础零散补充
s1mba
2018/01/03
7480
c/c++基础零散补充
【C语言】基础数据类型的隐式转换、截断和整型提升(超详细)
你是否在学习C语言时有认真思考过,如果表达式两边的是不同的数据类型的变量参与运算或者一个双目运算符的操作数的数据类型不一样时(就比如int类型的数据和char类型的数据相加),它们究竟会摩擦出怎样的火花,本文就来探讨一下。
埋头编程
2024/10/16
5920
【C语言】基础数据类型的隐式转换、截断和整型提升(超详细)
-1>1?! unsigned int的世界不简单
编程语言提供了很多的基本数据类型,比如char,int,float,double等等。在C和C++的世界中,还有一种类型,叫做无符号数据,修饰符位unsigned,比如今天要说的unsigned int。引入特殊的类型,一方面带来了好处,一方面也留下了隐患。
于果
2021/08/25
9770
C语言进阶指南(4)(数据类型——整数类型详解)
int用于声明一个整数类型的变量,我们根据变量的实际应用可以使用short int,long int,long long int。
代码小豪
2024/06/06
2100
整型及相关运算符 【Go语言圣经笔记】
Go语言的数值类型包括几种不同大小的整数、浮点数和复数。每种数值类型都决定了对应的大小范围和是否支持正负符号。让我们先从整数类型开始介绍。
Steve Wang
2021/12/06
1.1K0
《深入理解计算机系统》阅读笔记--信息的表示和处理(上)
在开始先来看一个有意思的东西: root@localhost: lldb (lldb) print (500 * 400) * (300 * 200) (int) $0 = -884901888 (lldb) print ((500 * 400)* 300) * 200 (int) $1 = -884901888 (lldb) print ((200 * 500) * 300) * 400 (int) $2 = -884901888 (lldb) print 400 * (200 * (300 * 500
coders
2018/05/28
1K0
深入理解计算机系统(2.6)------整数的运算
IT可乐
2018/01/04
1.6K0
深入理解计算机系统(2.6)------整数的运算
C语言入门系列之12.位运算
位运算是指按二进制位进行的运算,这是因为在系统软件中,常要处理二进制位的问题。 例如,将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。
cutercorley
2020/07/23
1.1K0
C语言入门系列之12.位运算
【C语言】数据在内存中的存储
不同的数据在内存中的存储形式是不同的,而当我们掌握数据在内存中的存储形式之后,会帮助我们更加了解计算机深层工作原理 废话不多说,我们接下来直接进入正题
举杯邀明月
2023/04/12
1.1K0
【C语言】数据在内存中的存储
【必读】C语言基础知识大全
C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使小伙伴对c语言有个初步认识。 例1:计算两个整数之和的c程序: #include main() { int a,b,sum; /*定义变量a,b,sum为整型变量*/ a=20; /*把整数20赋值给整型变量a*/ b=15; /*把整数15赋值给整型变量b*/ sum=a+b; /*把两个数之和赋值给整型变量sum*/ printf(“a=%d,b=%d,su
老九君
2018/03/06
6.4K0
【必读】C语言基础知识大全
代码质量分析-整数处理问题
问:C语言中的uint8_t\uint_16_t\uint32_t\uint64_t是什么?
Cloudox
2022/08/07
1.2K0
c语言中的位移位操作
能够自己实践实践阿。引用自:http://blog.chinaunix.net/u1/33888/showart_334911.html
全栈程序员站长
2022/07/12
6840
【C语言笔记】关于有符号数与无符号数的一些总结
原因是因为编译器会将有符号数b转换成为一个无符号数,即此处a+b等价于a+(unsigned int)b。
正念君
2019/06/26
4.2K0
【C语言笔记】关于有符号数与无符号数的一些总结
推荐阅读
相关推荐
深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验