iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言如何实现无符号数和有符号数间的运算
  • 586
分享到

C语言如何实现无符号数和有符号数间的运算

2023-06-17 04:06:51 586人浏览 安东尼
摘要

本篇内容主要讲解“C语言如何实现无符号数和有符号数间的运算”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现无符号数和有符号数间的运算”吧!unsigned int和int进行运算直接

本篇内容主要讲解“C语言如何实现无符号数和有符号数间的运算”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现无符号数和有符号数间的运算”吧!

unsigned int和int进行运算

直接看例子来说明问题吧

#include <iOStream>using namespace std;int main(){     int a = -1;     unsigned int b = 16;     if(a > b)         cout<<"负数竟然大于正数了!\n";     return 0;}

输出结果为:

C语言如何实现无符号数和有符号数间的运算

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

a : 11111111 11111111 11111111 11111111

b : 00000000 00000000 00000000 00010000

看成无符号数,自然是a>b。

#include <iostream>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;}

输出结果为:

C语言如何实现无符号数和有符号数间的运算

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

unsigned char和char进行运算

看一个颠覆上面逻辑的例子:

#include <iostream>using namespace std;int main(){     char a = -16;     unsigned char b = 14;     if(a > b)         cout<<"负数大于正数了!\n";     cout<<a+b<<endl;     return 0;}

输出结果:

C语言如何实现无符号数和有符号数间的运算

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

之所以会出现上面的结果是因为,C语言中比int小的整型(包括short 、unsigned short 、 unsigned char和char)在运算中都要转换成int然后进行运算。所以上面,无论是逻辑运算a>b还是算术运算a+b中a和b都默认转换成了int,所以算术运算的结果也是带符号的。

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

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

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

比如:

#include <iostream>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;}

C语言如何实现无符号数和有符号数间的运算

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

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

比如:

#include <iostream>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;}

C语言如何实现无符号数和有符号数间的运算

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

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

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

00000000 00000000 00000000 00001111,还是15

#include <iostream>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;}

C语言如何实现无符号数和有符号数间的运算

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

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

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

到此,相信大家对“C语言如何实现无符号数和有符号数间的运算”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: C语言如何实现无符号数和有符号数间的运算

本文链接: https://www.lsjlt.com/news/287143.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言如何实现无符号数和有符号数间的运算
    本篇内容主要讲解“C语言如何实现无符号数和有符号数间的运算”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现无符号数和有符号数间的运算”吧!unsigned int和int进行运算直接...
    99+
    2023-06-17
  • C语言详细解析有符号数与无符号数的表示
    目录一、计算机中的符号位二、有符号数的表示法三、无符号数的表示法四、signed 和 unsigned五、小结一、计算机中的符号位 数据类型的最高位用于标识数据的符号 最高位为1,表...
    99+
    2022-11-13
  • C语言如何返回一个无符号数的后n位数
    这篇文章主要为大家展示了“C语言如何返回一个无符号数的后n位数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何返回一个无符号数的后n位数”这篇文章吧。返...
    99+
    2022-10-19
  • 如何用C语言实现将格式化数据和字符串相互转换
    这篇文章主要讲解了“如何用C语言实现将格式化数据和字符串相互转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用C语言实现将格式化数据和字符串相互转换”吧!sprintf和sscanf用...
    99+
    2023-07-05
  • Go语言strconv包如何实现字符串和数值类型的相互转换
    这篇文章将为大家详细讲解有关Go语言strconv包如何实现字符串和数值类型的相互转换,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在实际开发中我们往往需要对一些常用的数据类型进行转换,如 string、...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作