无符号整形(size_t)使用时候的注意事项

size_t是标准库中经常会出现的一个关键字,其表示一个无符号整形,在标准库中经常用其来表示大小。比如:  strlen()的返回值就是size_t等等。

无符号整形的使用过程中有一点特别需要注意,就是两个无符号的数据计算的结果还是无符号类型。

 

举个例子:

 我们定义两个size_t类型的数据,

    #include <stddef.h>

    size_t s1 = 1;
    size_t s2 = 2;

 
执行下面这条打印语句:

   printf("%d\n", s1 - s2);       // 打印的结果是-1

 
从上面的打印语句看,好像s1和s2两个无符号数相减也可以存在负数,其实最后打印出-1是因为我们printf指定输出的类型为%d,是一个有符号类型,所以在输出的时候,将他两的结果转换成了有符号类型。

你可以将上面的打印语句换成: 

printf("%u\n", s1 - s2);        // 会发现其会打印一个很大的值,因为对于有符号数而言,上面两数相减结果为-1,其对应二进制最高位和最低位都是1,所以转换为无符号数自然很大。

上面不是一切正常吗? 那你看下面的打印语句

  printf("%d\n", s1-s2 > 0);    // 这行打印语句的输出结果为1,也就说明后面的比较表达式返回的结果是1,也就说明s1-s2的值是大于0的,但是对于有符号数而言它的结果是-1,应该比0小才对。

 printf("%d\n", (int)s1-(int)s2 > 0);  // 比如这样,输出的结果就是0.,因为我们将无符号转换为了有符号的类型。

所以使用size_t和其它的无符号数的时候应该注意: 

其运算结果是一个无符号数,在使用其计算结果与别的的数进行比较的时候,例如:与0比较尤其需要注意这个问题。

那么怎样去避免这个问题呢?

我们可以在使用其运算结果比较的时候,将其转换为有符号的int类型,有些编译器可能会给出警告,但是int和unsigned int的字节数都一样,只会修改正负值不会导致数据截断。

(但是请注意: 对于负数而言,有符号数和无符号数的值可能不仅仅是正负的区别,数值上也是不一样的,比如: 1000 0001 : 有符号数为: -1 ,  无符号数为: 129)

所以:上面所说的问题出现的原因是:   你在声明变量的时候使用的是无符号数,因为这个变量不会为负,但是如果两个无符号数相减,那么小的减去大的。
按照正常的逻辑,肯定是负值,但是对于无符号数并不是这样。如果你在两数相减的时候是按照正常的逻辑来使用,那么就转换成有符号类型,否则就无需转换。

一般情况只需要在使用两值差值进行比较的时候才需要考虑这个问题。

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

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

相关文章

C++---运算符重载

运算符重载介绍 在类中重新定义运算符&#xff0c;赋予运算符新的功能以适应类的运算&#xff0c;就称为运算符重载。 运算符重载是一种形式的C多态,它使得对象操作更直观,本质上也是属于函数重载。 实际上&#xff0c;我们已经在不知不觉之中使用了运算符重载。例如&#xff…

编一个自己的万年历

编一个自己的万年历 前阶段突然想查一下某一天是星期几&#xff0c;于是自己编了一个[小程序][https://blog.csdn.net/weixin_41905135/article/details/138972055?spm1001.2014.3001.5501]&#xff0c;但是功能很单一&#xff0c;就是单纯的查是星期几。&#xff08;虽然用网…

IRFB3207PBF TO-220 N沟道75V/180A 直插MOSFET场效应管

英飞凌&#xff08;Infineon&#xff09;的 IRFB3207PBF 是一款高性能的 N 沟道 MOSFET&#xff0c;适用于多种电子设备和系统中的高侧开关应用。以下是 IRFB3207PBF 的一些典型应用场景&#xff1a; 1. 电源管理&#xff1a;在电源管理系统中&#xff0c;IRFB3207PBF 可以作为…

【LeetCode】【4】寻找两个正序数组的中位数(2105字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2 提示Python实现二分查找划分数组 个人主页&#xff1a;丷从心 系列专栏&#xff1a;LeetCode 刷题指南&#xff1a;LeetCode刷题指南 题目描述 给定两个大小分别为m和n的正序&#xff08;从小到大&#xff09;数组nums1…

SpringBoot学习之SpringBoot是什么?有哪些优势?(通俗易懂版)

一、什么是SpringBoot&#xff1f;什么是约定优于配置&#xff1f; SpringBoot 是一个基于 Spring 框架的快速开发应用程序的开源框架&#xff0c;简化了Spring应用的初始搭建和开发过程。使用了特定的方式进行配置使开发人员不再需要定义样板化的配置&#xff0c;使用最少的配…

2024年是不是转行AI产品经理的机会?

首先从一个公司的微观角度来谈谈这一年来公司对AI看法的转变。一年前自己在某大厂做了一件小事&#xff1a;在商家后端嵌入一个小功能&#xff1a;智能生成商品卖点描述&#xff0c;商品评价描述。那时候是一个边缘项目&#xff0c;我们对接的AI 底层团队基本没什么活儿可以接&…

Java面试八股之Synchronized和ReentrantLock的区别

Synchronized和ReentrantLock的区别 实现级别&#xff1a; synchronized是Java的一个关键字&#xff0c;属于JVM层面的原生支持&#xff0c;它通过监视器锁&#xff08;Monitor&#xff09;来实现同步控制&#xff0c;无需手动获取和释放锁。 ReentrantLock是java.util.conc…

本地centos7+docker+ollama+gpu部署

1、一台有 NVIDIA GPU 驱动的机器 2、Docker CE安装 # 删除旧版本的 Docker&#xff08;如果存在&#xff09; sudo yum remove -y docker docker-common docker-selinux docker-engine # 安装必要的软件包&#xff1a; sudo yum install -y yum-utils device-mapper-persiste…

更新web文件40秒后生效

服务器web服务使用的是nginx。 经测试&#xff0c;上传文件后大约40秒后生效。 更新文件不立即生效。 网上资料说根nginx中sendfile选项有关。 在nginx配置文件中&#xff0c;http区域里将sedfile设置为off&#xff0c;重启nginx服务。 谷歌浏览器强制刷新一次&#xff0c;…

Java研学-RBAC权限控制(七)

八 表单验证 1 Bootstrap-validator Bootstrap-validator是一个基于 Bootstrap 的表单验证插件&#xff0c;它可以帮助开发者更方便地进行表单验证&#xff0c;提高用户体验。 ① 引入插件 <!--引入验证插件的样式文件--><link rel"stylesheet" href"…

docker中安装jenkins,并在node和cloud上跑通基于源码控制SCM的pipeline

目录 一、摘要 二、部署和使用 1. docker部署jenkins 1.1 准备数据目录 1.2 拉取jenkins镜像并启动 1.3 初始化配置 1.3.1 登录容器查看初始化密码 1.3.2 访问jenkins并输入初始化密码 1.3.3 创建管理员账户 1.3.4 初始化完成 2. jenkins使用之多分支流水线 2.1 准…

Java解决用@value从配置文件中给静态变量赋值的问题

问题描述 value放在实例变量上会生效&#xff0c;放在静态变量上不会生效&#xff0c;原因是Value是在bean实例化的时候进行属性赋值的&#xff0c;而静态变量是在类进行初始化的时候赋值的。 解决思路 可以在进行实例初始化的时候&#xff0c;将静态变量赋值。 解决方案 目前…

EI会议的录用通知和后续步骤是什么?

收到EI会议的录用通知后&#xff0c;通常会有一系列后续步骤&#xff0c;以下是一般的流程&#xff1a; 1. 录用通知 确认录用通知&#xff1a;在收到录用通知后&#xff0c;仔细阅读通知内容&#xff0c;确认你的论文已经被会议录用。查看详细信息&#xff1a;录用通知中通常…

WPF中DataGrid实现多选框功能

1. 效果图 2. Model建立 public class RstModelCheck : ObservableObject {//为了显示Head1和Head2.而且View中绑定属性而非字段&#xff0c;否则不能显示。public string? Name { get; set; } public bool PlatenAll {get > _platenAll;set{SetProperty(ref _platenAl…

Python实现将LabelMe生成的JSON格式转换成YOLOv8支持的TXT格式

标注工具 LabelMe 生成的标注文件为JSON格式&#xff0c;而YOLOv8中支持的为TXT文件格式。以下Python代码实现3个功能&#xff1a; 1.将JSON格式转换成TXT格式&#xff1b; 2.将数据集进行随机拆分&#xff0c;生成YOLOv8支持的目录结构&#xff1b; 3.生成YOLOv8支持的YAML文件…

基于EBAZ4205矿板的图像处理:07sobel边缘检测算法

基于EBAZ4205矿板的图像处理&#xff1a;07sobel边缘检测算法 项目文件 随后会上传项目全部文件&#xff0c;和之前一样免费下载 先看效果 如上所见&#xff0c;能够提取图像的边缘&#xff0c;这个sobel边缘检测算法的阈值&#xff08;认定是否为边缘的阈值&#xff09;一样…

C++入门 基于ros的话题通信

一、 开发环境 ubuntu20.04 ros版本noetic 参考视频 https://www.bilibili.com/video/BV1Ci4y1L7ZZ/?p52&spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source4cd1b6f268e2a29a11bea5d2568836ee 二、 创建两个功能包 //创建工作空间 工作空…

英伟达:AI之火还在燃烧!

昨晚&#xff0c;全球市场屏息以待的一家公司财报终于发布了&#xff0c;没有超出大家预期的是&#xff0c;他还是超预期了。 大家当然都知道我们要说的是——英伟达&#xff01; 如今&#xff0c;全球大模型之Z激Z正酣&#xff0c;AI芯片装备竞赛需求猛烈&#xff0c;作为AI…

浅析智能体开发(第二部分):智能体设计模式和软件架构

大语言模型&#xff08;LLM&#xff09;驱动的智能体&#xff08;AI Agent&#xff09;展现出许多传统软件所不具备的特征。不仅与传统软件的设计理念、方法、工具和技术栈有显著的差异&#xff0c;AI原生&#xff08;AI Native&#xff09;的智能体还融入了多种新概念和技术。…

外汇天眼:塞舌尔券商JustMarkets被控为诈骗平台,众多交易纠纷背后的真相究竟为何?

近年来外汇市场因为具有高流动性、交易时间长、不容易被操控等特色&#xff0c;受到愈来愈多投资人重视&#xff0c;相关交易愈来愈火热。外汇天眼身为全球最权威的经纪商查询平台&#xff0c;不仅致力于收录交易商信息&#xff0c;也经常发布券商解析与测评文章。最近我们发现…