小心c语言中的无符号类型-尤其是涉及到大小比较

Linux C高阶(19)C语言隐式类型转换的陷阱 微信公众号:二进制人生 专注于嵌入式linux开发。 更新:2020/05/21,转载请注明出处。 隐式类型转换是C语言的一大诡异之处,语句或表达式通常应该只使用一种类型的变量和常量。然而,如果你混合使用类型,C使用一个规则集合来自动完成类型转换。这可能很方便,但也很危险。 当出现在表达式里时,有符号和无符号的char和short类型都将自动被转换为int类型,在需要的情况下,将自动被转换为unsigned int(在short和int具有相同大小时)。这称为类型提升。提升在算数运算中通常不会有什么. 阅读详情

本文系转载:原文出处为 http://blog.youkuaiyun.com/max_min_go/article/details/10056955

不多说,说了都是累赘!直接看代码吧!



有兴趣的可以先猜猜结果是啥,然后再运行下,看看结果是不是和自己想的一样? 其中的道理又是什么呢?
gcc 下如行结果如下:
the bug is out!
所定义的值是unsigned int 类型(因为sizeof()返回类型是无符号的),if 语句在有符号和无符号之间测试相等性,所以将d升级为无符号(unsigned int )类型,-1转换成 unsigned int 的结果是一个非常巨大的正整数的,致使表达式为假,所以要想结果正确,先得强转类型。
对无符号的建议;

1 尽量不要在代码中使用无符号类型,以免增加不必要的复杂性,尤其是仅仅因为无符号数不存在负值而用它来表示

2 尽量使用int这样有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况(-1 翻译成非常大的整数)

3 只有在使用位段和二进制掩码时,才使用无符号数。而且应该在表达式中使用强制类型转换,使操作数均为

   有符号数或者无符号数,这样不必由编译器来选择结果的类型


单片机C语言实战:双色点阵显示控制项目 I2C和SPI是两种常用的串行通信协议,它们在低速外设通信中广泛应用。I2C是多主控的串行总线,具有两根线:串行数据线(SDA)和串行时钟线(SCL)。而SPI则是同步串行通信协议,需要至少四根线:主设备输出从设备输入(MOSI)、主设备输入从设备输出(MISO)、时钟线(SCLK)和从设备选择(SS)。// I2C初始化代码示例// 设置I2C速率和模式I2C速率控制寄存器 = 设置值;I2C模式选择寄存器 = 模式选择值;// SPI初始化代码示例// 设置SPI速率、模式和数据格式。 阅读详情

相关推荐

2023-12-26~2025-07-04备份

一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。

青铜小码农 3126

【C语言】有符号和无符号数的比较运算

int a = -1; unsigned int b = 1; if(a < b) printf("a < b\r\n"); else printf("a > b\r\n"); if(a < (int)b) printf("a < b\r\n"); else printf("a > b\r\n"); 运行结果: a &g...

欢迎光临 4781

Python 格点数据插值到站点 最邻近插值 双线性插值

python 气象数据格点数据插值到站点,最邻近插值法,双线性插值法

好记性不如烂笔头 8457

C语言陷阱——无符号数和有符号数的大小比较

无符号数和有符号数的比较在C语言中是一个大陷阱,稍不注意就会将很多代码理解错误,当碰到返回类型为无符号数的操作符或函数时,我们一定要小心又小心,注意它和整数的比较,避免犯错。

Forward♞的博客 2331

LSTM模型 轨迹经纬度预测

原始时间序列数据如下所示,我们只取前两列纬度和经度作为输入数据 我们设定用前六个位置信息预测下一个位置,则两个样本的输入输出数据如下所示: 创建LSTM网络训练模型: import numpy as np from keras.layers.core import Dense, Activation, Dropout from keras.layers import LS...

Muzi_Water的博客 2万+

清华数据结构列车调度AC100分

两种思路(1)将目标栈的数据和待混洗的数据逐个进行比较#pragma warning(disable:4996) #include&lt;stdio.h&gt; #include&lt;string.h&gt; #define maxn 1600005 using namespace std; char a[2*maxn][5];//记录操作命令 int stack[maxn]; char pop...

hgtjcxy的博客 923

关于c语言的一个小bug(c专家编程)

不多说,说了都是累赘!直接看代码吧! #include &lt;stdio.h&gt; int array[] = {23, 34, 12, 17, 204, 99, 16}; #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) int main (void) { int d = -1, x; if( d &...

897371388 261

【CloudCompare】Windows源码编译CloudCompare

本文详细介绍了在Windows环境下编译安装CloudCompare V2.12.0的过程。首先配置了PCL 1.14.1、CMake 3.30.6和QT 5.14.2开发环境,使用Visual Studio 2022工具集。然后下载源码并通过CMake进行配置,特别注意勾选PLUGIN_STANDARD_QPCL以支持PCD文件加载。最后在VS2022中编译安装,并指出Debug模式下可能遇到的VTK库后缀问题,需添加CMAKE_DEBUG_POSTFIX变量解决。整个流程涵盖了从环境搭建到最终编译成功的

yijiujiusan的博客 484

无符号数与符号数比较大小

原来sizeof的返回值是一个无符号返回值,当有符号类型与无符号类型比较时,他们是如何进行转换来最后比较大小的。

weixin_68079583的博客 3121

Android 9.0 延时开机动画解决首次开机黑屏和去掉android正在启动的提示框

在9.0的系统产品rom定制化开发中,在一些产品中会出现在首次开机的时候,由于在开机动画播放完以后会出现几秒短暂的黑屏情况,然后进入默认Launcher,这在产品体验上 也是感觉到有点差,所以会要求在去掉这个首次开机黑屏的效果,和在启动过程中的 android is starting这个提示框的这些效果优化,接下来就分析下相关功能, 然后实现这个功能的开发

安卓兼职framework和app工程师的博客 3244

S7-1200中时钟功能设定和读写调用的具体方法

S7-1200中时钟功能设定和读写调用的具体方法

Robot_PLC_HMI_Automation 1万+

无符号数与有符号数比较大小

申明: 本博文源自:http://blog.youkuaiyun.com/qiuchangyong/article/details/7495008 在此感谢博主!先出几个题目,再解释一下为什么答案是那样的。题目一:int a = -1; unsigned int b = 1; printf("%d", a > b);结果输出: 1因为无符号数与有符号数比较时,要将有符号数转化为无符号数,再来比较。a 转化为

专注于 IOT 物联网的嵌入式研发 2万+

[SV]SystemVerilog状态机实现案例

本文介绍了SystemVerilog中状态机的实现方法。首先使用枚举类型定义状态(TOP_HIB、TOP_BG、TOP_LDO、TOP_NOR),然后通过三个主要任务实现状态机:1)格式化现态寄存器处理状态转换;2)描述状态转移条件,包括计时器和稳定时间判断;3)基于当前状态和输入信号确定次态。状态机在时钟边沿或复位时更新状态,实现了从休眠到正常工作状态的转换逻辑,包含电源稳定时间检测等关键功能。

元直的博客 2018

C语言数据的存储读取

在C语言中,有一些基本类型,如int,float,double,char等,它们还分为有符号类型和无符号类型(unsigned int就是无符号整型),它们所能存储的数据范围不同。当然它们的存储方式也有所差异,接下来我们来了解一下它们的存储方式。以下所讲都是以VS2022,X86环境下为例。首先数据都分为有符号和无符号两种类型,以int类型为例,分为int(有符号),umsigned int(无符号),一个int类型的数据占用4个字节的空间,也就是32个bit。

m0_74506452的博客 1193

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C语言:变量的深入理解

在C语言中对里面的变量做的一些深入理解

weixin_57418095的博客 1442

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

有符号整型和无符号整型比较大小,整型提升{9.28下午}

有符号整型和无符号整型比较大小时,会先把有符号整型先转变成无符号整型-1的补码是32个1,当成无符号整型来处理时,补码就是源码,所以是一个超级大的数在C语言中,当有符号整型(如int)和无符号整型(如)进行比较时,并不会直接将有符号整型转换为无符号整型来进行比较。然而,实际的行为可能会让人误解为发生了这样的转换,因为比较操作是按照“值的二进制表示”来进行的,而不是按照它们的数学意义。在比较时,有符号整型会被“隐式地”转换为一个更大的类型(在这个情况下,通常是),但这个转换并不是简单的数值转换。

fhgfyrsg的博客 1421

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C语言——数据的存储

​ 在C语言中常见的字符类型7种(由小到大列出)​ char:(字符型)在内存中占1个字节​ short:(短整型)在内存中占2个字节​ int:(整型)在内存中占用4个字节​ long:(长整型)在内存中占用(long long>=long>=int)个字节,根据编译器决定​ long long:(长整型)在内存中占用8个字节​ float:(单精度浮点型)在内存中占用4个字节​ double:(双精度浮点型)在内存中占用8个字节​ 这里提一下在。...

闲来垂钓碧溪上的博客 650

C语言细节笔记1

/******************************************************************************* ——笔记 1. 函数申明的书写。 可以省略参数名称,只保留参数类型,但最好不要省略形参名称,他们常可以 向程序员传递一些有用的信息。 char * strcpy...

weixin_30883271的博客 153

C语言如何定义蚂蚁的颜色,c语言中的关键字

c语言中的关键字 附录2 C语言中的关键字 C 语言共有 32个关键字: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef ...

weixin_35857552的博客 137

葡萄学习——C语言必备(三)

C语言基本数据类型与ASCII码解析 本文系统介绍C语言基本数据类型及其特性,包括字符型(char)、整型(int/short/long)、浮点型(float/double)等,重点解析ASCII码作为字符-数字转换表的本质。文章阐明各类型内存占用与取值范围,揭示字符型实际存储ASCII码值的特性,分析类型转换规则和常见陷阱(如溢出、精度丢失)。特别强调浮点数不精确性、结构体内存对齐原则及无符号类型溢出循环特性。通过典型代码示例演示数据类型核心概念,提供实用避坑建议。

爱学习的小葡萄~ 2476

「C系列」C 强制类型转换

在C语言中,当不同类型的整数参与算术运算时,会进行一系列的隐式类型转换,这些转换被称为“常用算术转换”(Usual Arithmetic Conversions)或“整数提升和转换”(Integer Promotions and Conversions)。注意:在实际编程中,应当尽量避免混合使用有符号和无符号整数进行算术运算,因为这可能导致意外的结果,尤其是当涉及到溢出和负数时。:如果两个操作数都是有符号的或都是无符号的,并且它们的类型不同,则较小类型的操作数会被转换为较大类型的操作数。

日常笔记/总结/系列知识梳理 7356

C语言教程-3_1-数据类型

C语言教程-3_1-数据结构

qq_43156747的博客 1228

C语言中的隐式转换与整型溢出:实战技巧与经验分享

隐式转换是指在C语言中,编译器根据上下文自动将一种数据类型转换为另一种数据类型的过程。它是由编译器在执行运算时自动进行的,无需程序员显式地干预。不同类型的变量参与运算时:当不同类型的变量(如int​和float​)参与运算时,编译器会根据运算规则将其转换为统一的类型。赋值操作:将一种数据类型的值赋给另一种类型的变量时,编译器会自动进行类型转换。整型溢出是指在存储超出整型数据类型能表示的最大值时,发生的不可预知行为。

探索技术、创意与生活的交汇点,分享个人成长与思考,带你发现生活中的美好与智慧 1211

C语言知识点总结2

继续我的C语言学习与总结,今天会探讨以下问题: 1、关于无符号数据类型与有符号数据类型的加减和比较大小的问题 这个问题我也一直比较模糊,关于加减法我做了如下测试,代码如下: signed int x=-50; unsigned int y=-40; signed int z=x+y; 变量z的结果为0xFFFFFFA6(我使用的是STM32系列MCU,int数据类型是32位的),这是保存

jmmx的专栏 620

C语言的数据类型

C语言的数据类型是编程的基石,涉及基本类型、构造类型和指针类型的选择与使用。通过对这些数据类型的深入理解,程序员可以写出更高效、可维护的代码。随着技术的发展,掌握C语言的数据类型不仅能帮助我们更好地理解编程的基本概念,而且为学习其他高级编程语言打下坚实的基础。想要成为优秀的程序员,谨记熟练掌握数据类型的使用,理解其在内存管理、性能优化等方面的重要性,以便在编程的道路上走得更远。

2401_90085823的博客 710

【嵌入式】嵌入式C语言基础语法之常用关键字

嵌入式C语言的关键字大多数与标准C语言相同,但有一些扩展和特定的关键字用于处理硬件中断、内存管理、寄存器访问和优化。

Ace_Spade的博客 1255
上一篇: android的消息处理机制(图+源码分析)——Looper,Handler,Message
下一篇: Makefile中的几种赋值方式
tp_xiaomin
博客等级 码龄20年 10粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值