C语言无符号数运算问题

C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了。
unsigned int和int进行运算

直接看例子来说明问题吧
复制代码

#include

using namespace std;

int main()

{

     int a = -1;unsigned int b = 16;if(a > b)cout<<"负数竟然大于正数了!\n";return 0;

}

复制代码

输出结果为:

这是因为a和b进行比较的时候,编译器将有符号数a看成了无符号数,然后再和b进行比较,在内存中(32位)

a : 11111111 11111111 11111111 11111111

b : 00000000 00000000 00000000 00010000

看成无符号数,自然是a>b。
复制代码

#include

using namespace std;

int main()

{

     int a = -1;unsigned int b = 16;cout<<a + b<<endl;int c = -16;unsigned int d = 15;cout<<c + d<<endl;return 0;

}

复制代码

输出结果为:

可以看到a+b的结果貌似比较正常,但是c+d和我们想象的好像不太一样。其实4294967295就是11111111 1111111 11111111 1111111就是-1在内存中的形式,看成无符号数就是这个结果啦。所以unsigned int和int做运算会将int看成unsigned int,而且结果也是unsigned int。

unsigned char和char进行运算

看一个颠覆上面逻辑的例子:
复制代码

#include

using namespace std;

int main()

{

     char a = -16;unsigned char b = 14;if(a > b)cout<<"负数大于正数了!\n";cout<<a+b<<endl;return 0;

}

复制代码

输出结果:

如果按照上面unsigned int和int进行运算的逻辑,这里unsigned char和char进行运算,那应该是a要看成无符号数,所以a的值比较大呀,而且a+b的结果应该是-2对应的无符号数,也就是254才对呀?

之所以会出现上面的结果是因为,C语言中比int小的整型(包括short 、unsigned short 、 unsigned char和char)在运算中都要转换成int然后进行运算,至于为什么选择转换为int,应该是从效率上考虑的,因为通常情况下int的长度被定义为机器处理效率最高的长度,比如32位机上,一次处理4个字节效率是最高的,所以虽然short(我机器上占2个字节)更节省内存,但是在运算中的效率,是int更高。所以上面,无论是逻辑运算a>b还是算术运算a+b中a和b都默认转换成了int,所以算术运算的结果也是带符号的。

但是还需要注意一个问题就是转换成int类型的时候,高位补齐的问题。

如果是unsigned的类型转换成int类型,高位补0.

如果是signed的类型转换成int类型,如果原来最高位是1则补1,如果是0则补0。

比如:
复制代码

#include

using namespace std;

int main()

{

     char a = -16;unsigned char b = 255;char c = 255;cout<<a+b<<endl;cout<<a+c<<endl;return 0;

}

复制代码

其中char c = 255,在内存中为11111111,最高位是1,转换成int时高位补1,也就是11111111 11111111 11111111 11111111,就是-1

注意:转换成unsigned int类型时,也是一样的。

比如:
复制代码

#include

using namespace std;

int main()

{

     char a = 255;unsigned int b = a;cout<<b<<endl;char c = 15;unsigned int d = c;cout<<d<<endl;return 0;

}

复制代码

a在内存中为11111111,最高位是1,转换时高位补1,也就是

11111111 11111111 11111111 11111111,也就是无符号数2^32

c在内存中为00001111,最高位是0,转换高位补0,也就是

00000000 00000000 00000000 00001111,还是15
复制代码

#include

using namespace std;

int main()

{

     unsigned char a = 255;int b = a;cout<<b<<endl;unsigned char c = 15;int d = c;cout<<d<<endl;return 0;

}

复制代码

对于unsigned char在转换成int或unsigned int时,无论最高位是0还是1,都补0。

对于unsigned short和short进行运算,和char和unsigned char一样,都是要先转换成int,然后再进行运算。

转换时高位补齐的方法也和unsigned char、char一样。

再来一个例子:
int main()
{
unsigned int a=50;
unsigned int b=100;
printf("%u",a-b);
return 0;
}

结果是4294967246

为什么呢?

实际上 CPU里只有加法器 没有减法器 做a-b运算时,实际上是做了a+(~b)

因为计算机运算采用补码运算

a-b=a[补码]+(-b)[补码]

50的二进制是: 00000000|00000000|00000000|00110010
100的二进制是: 00000000|00000000|00000000|01100100

50的补码是 00000000|00000000|00000000|00110010

-100的补码是 11111111|11111111|11111111|10011100

补码相加得到的结果是 11111111|11111111|11111111|11001110=4294967246

由于a-b得到的是无符号整形,所以原码与补码相等 结果自然为4294967246

1、https://www.cnblogs.com/qingergege/p/7507533.html
2、https://blog.csdn.net/Xiejunyi12/article/details/50654140?utm_medium=distribute.pc_relevant_bbs_down.none-task–2allfirst_rank_v2rank_v29-7.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task–2allfirst_rank_v2rank_v29-7.nonecase

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

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

相关文章

Unity3D_(游戏)控制物体的上、下、左、右移动

通过键盘上↑、↓、←、→实现对物体的控制 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Gary_Text : MonoBehaviour {public Transform WuTi;public float speed 1;// Use this for initializationvoid Start () {}// Upda…

糟糕的C语言睡眠排序算法

不知道大家知道这个算法没有&#xff0c;就是靠睡觉完成排序的。比如数字1 4 3&#xff0c;第一个数字1的时候&#xff0c;创建一个线程&#xff0c;然后让线程休眠1个时间单位&#xff0c;依次是 4 和 3个单位。因为睡眠的时间不同&#xff0c;线程醒的时间也不同。3会比4先醒…

Rocchio算法

其基本思想是使用训练集为每个类构造一个原型向量&#xff0c;构造方法如下&#xff1a;给定一个类&#xff0c;训练集中所有属于这个类的文档对应向量的分量用正数表示&#xff0c;所有不属于这个类的文档对应向量的分量用负数表示&#xff0c;然后把所有的向量加起来&#xf…

C语言定义:__DATE__和_TIME__

/******************************************************************** > File Name: 05-ymd.c* > Author: fly* > Mail: XXXXXXXXicode.com在这里插入代码片* > Create Time: Thu Sep 7 16:43:30 2017**********************************************…

写给小白看的,逆向工程怎么上路?

什么是逆向工程大家好&#xff0c;我是写代码的篮球&#xff0c;这篇文章转自小白哥的文章。给大家出一道思考题&#xff1a;用C语言设计一个程序&#xff0c;验证输入的密码是否是“12345678”&#xff0c;如果验证成功&#xff0c;就输出“success”&#xff0c;如果验证失败…

vue中,点击button按钮后,页面上的input框再次自动获取焦点

需求&#xff1a;点击button按钮&#xff0c;录入成功后&#xff0c;页面上的input框自动聚焦&#xff0c;快速进行下一次录入&#xff0c;提高效率 开始尝试了几种方法都没有成功 一、首先想到的用vue指令 v-focus&#xff0c;然而没有成功 <Input v-model"book.isbnO…

线程、同步与锁——Mutex想说爱你不容易

除了Lock&#xff08;&#xff09;、Monitor之外&#xff0c;我们最长用的就是Mutex了&#xff0c;但是玩不好Mutex就总会造成死锁或者AbandonedMutexException&#xff08;我就玩的不怎么好&#xff0c;在并发性访问测试的时候总是遇到关于Mutex的问题&#xff0c;各位线虫见笑…

STM32F4 串口DMA

串口DMA方式收发 笔者使用的是STM32F407VET6&#xff0c;共包含6路串口&#xff0c;页尾处程序已将全部串口的DMA收发配置完成&#xff0c;本文仅以串口1为例进行讲解。&#xff08;查看代码可直接跳至第二节或页尾处下载&#xff09; 1 STM32F4 DMA 简介 DMA&#xff0c;全称为…

在广州的几天

我前两天写了文章说过&#xff0c;我大伯去世&#xff0c;然后我请假了几天去广州。这次去广州&#xff0c;挺感慨的&#xff0c;顺便记录下自己的一些想法。广州限行广州是限行的&#xff0c;但是广州的限行我觉得很人性&#xff0c;如果是外地车牌&#xff0c;你可以在广州行…

由马化腾谈“微博修改功能”,看什么是优秀的产品经理

我仔细阅读过马化腾的的简历&#xff0c;他是一位技术出身的企业家。也是腾讯最大的产品经理,大家都知道产品经理的对产品的重要性那是不言而喻的&#xff0c;而产品是公司的灵魂。 今天早上起床&#xff0c;看到马化腾先生更新的微博。有位网络公司的CTO建议腾讯微博加一个修改…

flask 必知必会

在局域网中让其它电脑访问我的网站 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return hello worldif __name__ __main__:app.run(debugTrue,host0.0.0.0,port9000) 转载于:https://www.cnblogs.com/wuheng-123/p/9665004.html

超酷的红外小车

推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号&#xff0c;后台回复「1024」获取学习资料网盘链接。欢迎点赞&#xff0c;关注&#xff0c;转发&#xff0c;在看&#xff0c;您的每一次鼓励&#xff0c;我都将铭记于心~

KEIL编译生成bin文件,并输出内存使用情况

一、STM32CubeMX生成的代码输出bin文件 输出bin文件&#xff1a; Run#1框填入的是&#xff1a;fromelf.exe空格–bin空格-o空格"$LL.bin"空格"#L"。“–bin”是两根英文短杆。 fromelf.exe --bin -o "$LL.bin" "#L"编译的时候&#x…

CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现

CRC16算法系列文章&#xff1a; CRC16算法之一&#xff1a;CRC16-CCITT-FALSE算法的java实现 CRC16算法之二&#xff1a;CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三&#xff1a;CRC16-CCITT-MODBUS算法的java实现 功能 实现CRC16-CCITT-MODBUS算法 支持int、short类型…

建议去华为

提问&#xff1a;老师&#xff0c;您好&#xff01;我现在手里有两个offer&#xff0c;正在艰难抉择中&#xff0c;一个是小米的相机图像调校工程师&#xff08;camera tuning&#xff09;&#xff0c;工作地在深圳&#xff0c;工资是12k*14&#xff0c;还有大概700元的餐补&am…

Stimulsoft reports .net中创建变量

Stimulsoft reports .net中创建变量<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />变量中request from user 的使用&#xff1a;可以使你在外面指定日期的选择。根据用户需要去选择不同的条件。报表中code代码中也可以使用代码…

STM32CubeMx官网下载HAL库文档资料

1、直接搜STMCubeMxFxx即可。https://www.st.com/zh/embedded-software/stm32cubef4.html#documentation

HTML5学习笔记(一):初步印象

&#xff08;一&#xff09;什么是HTML5(1)HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。(二)HTML5的前世今生&#xff08;1&#xff09;HTML5 是 W3C 与 WHATWG 合作的结果。W3C&#xff08;万维网联盟&#xff09;&#xff1a;World Wide Web ConsortiumWHATWG &#x…

快学好这个去给学妹修热水器

作者&#xff1a;晓宇&#xff0c;排版&#xff1a;晓宇微信公众号&#xff1a;芯片之家&#xff08;ID&#xff1a;chiphome-dy&#xff09;2021年6月25号晚上9点&#xff0c;中国南方某一线城市&#xff0c;小张正在看着前阵子新出的电影误杀2&#xff0c;窗外&#xff0c;疲…

bzoj1233 单调队列优化dp

https://www.lydsy.com/JudgeOnline/problem.php?id1233 数据结构优化dp的代码总是那么抽象 题意&#xff1a;奶牛们讨厌黑暗。 为了调整牛棚顶的电灯的亮度&#xff0c;Bessie必须建一座干草堆使得她能够爬上去够到灯泡 。一共有N大包的干草&#xff08;1<N<100000&…