char类型到底是有符号还是无符号的?

news2024/10/6 10:42:12

最近在整理代码时,发现有一些如下类型的警告:

..\XXXXX\XXXXX.c(224): warning:  #186-D: pointless comparison of unsigned integer with zero

这个警告的意思是无符号数与0比较是无意义,而我报警告的代码行如下:

char len_val = 0;
if ( len_val >= 0 && len_val < 9)  // 存在警告的行
{
	.......
}

这里len_val的类型是char,看起来不像是无符号的,而在C语言的教材中,一般默认char都是指有符号的,无符号的类型才会带 unsigned……百思不得其解。

为此我再次查阅了之前翻看的材料才发现,C99标准没有说明char类型是有符号还是无符号:

在头文件limits.h 说明了各种不同的整数类型的特点,同时定义了下列名字:CHAR_BIT是字符型的位数(至少8位);CHAR_MIN和CHAR_MAX定义了缺省字符类型的范围,它们或者应该与SCHAR_MIN 和 SCHAR_MAX相同,或者应该与0和UCHAR_MAX相同。

而是否相同,取决于具体实现的编译器。

也就是说,不同的编译器,对缺省的 char,要么是 signed char,要么是 unsigned char(废话,呵呵),就看编译器怎么实现的。这就意味着不同编译器的 char 可能拥有不同范围的值。那说到这里,就不得不提一下,程序的可移植性,比如说我在A编译环境中,char 是无符号的,到了B编译环境 char 就成了有符号的,那在移植后就可能会出现问题。

那怎么提高程序的移植性呢,很显然,直接显式声明是否有符号就可以了,so easy~

那我再告诉你个不幸的消息,那就是不同的编译器性格不同,有的编译器擅长处理 signed char,有的处理起 unsigned chnar 又得心应手,那么,如果把 char 硬改成 signed 或 unsigned 就可能损失效率。所以,把所有的char变量统一声明为 signed 或 unsigned 未必就是上上之选。还有些处理字符的库函数把它们的参数声明为char,如果你把参数显式声明为 unsigned char 或signed char,可能会带来兼容性问题。

这也不行 ,那又不好,那究竟要咋样?

书上的大牛说了:

将 char 型变量的值限制在 signed char 和 unsigned char 的交集内,这就可以获得最大程度的可移植性,而又不牺牲效率。并且,只有当 char 型变量显式声明为 signed 或 unsigned 时,才对它执行算术运算。

是不是很简单……哈哈……

生活就是带着镣铐跳舞,端看你的关注点在哪里,

所以,也没有必要完全按照上面的处理来,

但是,这个理论我们要知道,这就是读书的必要性!

好了,现在你知道上面为什么报这个警告了吗?

对了,我这里的的编译环境是KEIL。

是的,从这个警告你就可以推断出,这里把 char 处理成了unsigned char,只有这样才会有这个警告。

那我们来验证下:

在KEIL中通过菜单(Project->Options for Target 'XXXX')或快捷工具打开对话框,如下图所示:

 看到“Plain Char is Signed”这个选项了吗,KEIL默认是不选的,不选就意味着默认的 char 型是无符号的 ,即:char  = unsigned char,既然是无符号了,跟0比较,那必然是多此一啰嗦了,所以才会有上面的警告了。

所以,现在对于 “char类型到底是有符号还是无符号的”这个问题,你清楚了吧。

那就到这里吧~

感谢一起学习的XDJM,没事的时候,我们一起多啃啃专业书吧~

转载请注明出处哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/819921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里用户序列建模ETA

End-to-End User Behavior Retrieval in Click-Through Rate Prediction Model 摘要 现实很少有工作可以处理长序列用户建模的问题&#xff0c;SIM提出了两阶段方法。第一阶段&#xff0c;辅助任务旨在从长序列用户行为检索最相关的用户行为序列。第二阶段&#xff0c;经典的…

位图和 DC 有什么特别之处?

相信设备上下文 (DC, Device Context) 对你来说&#xff0c;应该很熟悉。 基本工作方式是&#xff0c;你可以通过调用 SelectObject 来将画笔(Pen)&#xff0c;画刷(Brush)&#xff0c;字体(Font)和位图(Bitmap)等这些对象选入设备上下文中&#xff0c;但是&#xff0c;这里的位…

Android 面试题 应用程序结构 十一

&#x1f525; Framework主要包含以下模块 &#x1f525; ActivityManagerService 这是一个Activity的管理者&#xff0c;负责管理所有Activity的生命周期。WindowManagerService 它是手机屏幕的的管理者&#xff0c;管理着屏幕的详细情况&#xff0c;所有对屏幕的操作最终都…

ChatGPT学python——制作自己的AI模型(一)初步了解

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…

2023国际先进制造青年科学家大会圆满结束!易知微受邀进行数字孪生主题报告分享

2023年7月30日&#xff0c;以“新青年&#xff0c;新视野&#xff0c;新制造”为主题的2023国际先进制造青年科学家大会在浙江绍兴开幕&#xff0c;旨在强力推进创新深化改革攻坚开放提升&#xff0c;进一步做强“人才&#xff0b;产业”双联驱动、人才集聚与产业发展共振同兴&…

NLP/CV相关模型库-阿里

模型库地址&#xff1a;https://www.modelscope.cn/models

30岁转行学编程,更容易成功

“男人30而立&#xff0c;我没有退路&#xff0c;只有选择勇往直前&#xff0c;这样我才能无所畏惧&#xff0c;因为我希望在我的人生篇章里&#xff0c;能拥有浓墨重彩的一笔&#xff01;” 30岁&#xff0c;在经历一番“打击”后毅然决然选择学编程&#xff0c;为家人也为自…

解决Mysql报错2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)

1.找到mysql文件夹&#xff0c;将my,ini文件放入bin文件夹 2.管理员模式打开cmd 3.输入netstat -ano查看端口占用情况&#xff0c;这里我已经开启mysql应用&#xff0c;所以会有3306&#xff0c;如果没有开启是不会有的 4.输入sc delete mysql&#xff0c;删除mysql服务 5.将…

Vue如何实现重定向

在刚登录之后&#xff0c;我们想要默认展示一下用户登录&#xff0c;这个功能如何实现&#xff1a; 就是重定向为/home/user这个值 我们就是在/home 上加一个重定向 具体怎么做那&#xff0c;先找到/home的路由规则 想要实现重定向,增加一个redirect就行

基于SpringBoot+Vue的广场舞团管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

无涯教程-Lua - 环境安装

在Windows上安装 为Windows环境开发了一个单独的名为" SciTE"的IDE,可以从https://code.google.com/p/luaforwindows/下载部分。 运行下载的可执行文件以安装Lua IDE。 由于它是一个IDE&#xff0c;因此您可以使用它来创建和构建Lua代码。 如果您有兴趣在命令行模…

【私藏】matlab踏实手把手常规练习附全套学习资料

目录 前言 福利&#xff1a;文末有matlab全套资料哦 01分段函数 02复合图 ⚪️ 两个一元函数yx^3-x-1和y|x|^(0.2)sin(5x)在区间-1<2的复合图。函数与图像<> 03三维平面图 ⚪️ 三维平面图使用mesh绘制网格图&#xff0c;surf绘制三维曲面图&#xff0c;使用…

filebeat kibana elasticsearch 日志监控

解压三个压缩包 一、filebeat的安装部署 1、打开filebeat的配置文件 2、Filebeat inputs 处打开日志输入开关&#xff0c;设置要监控的路径 3、Outputs 输出中设置Elasticsearch output的输出地址 4、执行 ./filebeat & 二、Elasticsearch 安装部署 1、修改配置文件 …

C语言:相交链表

Lei宝啊&#xff1a;个人主页 愿美好与我们不期而遇 题目&#xff1a; 描述 给你两个单链表的头节点 headA和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 接口 struct ListNode *getIntersectionNode (str…

使用javax.validation.constraints进行数据验证

使用javax.validation.constraints进行数据验证 在Java应用中&#xff0c;数据的验证是一个很重要的部分&#xff0c;特别是在接收用户输入或处理外部数据时。为了简化和标准化数据验证的过程&#xff0c;Java提供了javax.validation.constraints包&#xff0c;其中包含一系列注…

MySQL数据库——约束

文章目录 前言主键约束创建主键单列主键联合主键通过修改表结构来指定主键 删除主键约束 自增主键约束创建自增主键 非空约束创建非空约束删除非空约束 唯一约束创建唯一约束删除唯一性约束 默认约束创建默认约束删除默认约束&#xff08;改为null为默认值&#xff09; 零填充约…

安装Vue浏览器插件vue.Devtools(小白无压力教程)

1、打开网址:选择vue.js.Devtoolshttps://chrome.zzzmh.cn/index#/search极简插件是一个优质Chrome插件扩展收录下载网站&#xff0c;收录热门好用的Chrome插件扩展&#xff0c;国内最方便的插件下载网站。https://chrome.zzzmh.cn/index#/search 2、下载安装包后&#xff0c;…

【论文简述】DIP: Deep Inverse Patchmatch for High-Resolution Optical Flow(CVPR 2022)

一、论文简述 1. 第一作者&#xff1a;Rui Li 2. 发表年份&#xff1a;2023 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;光流、深度学习、PatchMatch、局部搜索 5. 探索动机&#xff1a;对于深度学习来说&#xff0c;除了准确性之外&#xff0c;性能和内存也是一个…

基于 FFlogs API 快速实现的 logs 颜色查询小爬虫

文章目录 找到接口解析响应需要平均颜色和过本次数&#xff1f; 找到接口 首先试了一下爬虫&#xff0c;发现和wow一样官网上有暴露的 API&#xff0c;链接在&#xff1a;FFlogs v1 API 文档链接 通过查询官方提供的 API 接口得知&#xff1a; user_name 角色名字 api_key …

解决安装VMware Tools灰色问题,解决重新安装VMware Tools灰色问题

一、环境 vmware 版本&#xff1a;17.0.0 build-20800274 centos 9 二、问题 安装VMware Tools 按钮为灰色 三、解决方法 网上很多写这些如何解决该问题的&#xff0c;如&#xff1a;配置CD/DVD&#xff08;SATA&#xff09;为自动检测&#xff0c;或者指定其CD镜像文件为…