社区
C++ 语言
帖子详情
关于无符号数相减
annatianmu2008
2009-01-23 03:51:03
小弟有个问题不明白,大家都知道库函数中计算字符串长度函数strlen返回一个类型size_t值,它是一个无符号数类型。书上说“在表达式中使用无符号数可能导致不可预料的结果”,然后举例说:
if( strlen(x)- strlen(y)>= 0 )。。。
说这个表达式结果将永远是真,strlen结果是个无符号数所以操作符>=左边的表达式也将是无符号数。
我就没搞懂,2个无符号数相减结果就不能产生有符号数吗?
请赐教,谢谢!!!
...全文
1846
12
打赏
收藏
关于无符号数相减
小弟有个问题不明白,大家都知道库函数中计算字符串长度函数strlen返回一个类型size_t值,它是一个无符号数类型。书上说“在表达式中使用无符号数可能导致不可预料的结果”,然后举例说: if( strlen(x)- strlen(y)>= 0 )。。。 说这个表达式结果将永远是真,strlen结果是个无符号数所以操作符>=左边的表达式也将是无符号数。 我就没搞懂,2个无符号数相减结果就不能产生有符号数吗? 请赐教,谢谢!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hongkai1234
2011-03-19
打赏
举报
回复
依照不同的编译器而定的!
lann64
2009-01-23
打赏
举报
回复
无符号数相减的结果先赋值给有符号的变量就可以产生有符号数了。
BenjaminHuang
2009-01-23
打赏
举报
回复
应该是从操作数和结果数的‘数据类型’去考虑这个问题。
因为 C/C++ 都是严格遵循类型规则的编程语言,C++ 更是如此。
至于从精度理解也不能算错,但是对于LZ取理解问题的本质会有一些障碍。
Darkneece
2009-01-23
打赏
举报
回复
当2个不同精度的常/变量在运算时,会先将精度低的一方扩展到精度高的一方相同的精度,结果也是精度高的一方的得类型。
如:
int i;
char c;
return i + c
运算时c会被扩展成int,结果也是int
另:
精度是浮点高于定点,(类型相同时)位长长者高于位长短者,(位长相同时)无符号类型高于有符号类型
waizqfor
2009-01-23
打赏
举报
回复
[Quote=引用 7 楼 annatianmu2008 的回复:]
我懂了,上面几位朋友意思是,当一个表达式是2个数相减,那么表达式的结果类型不可能比这2个数类型精度低,至少一样,所以2个无符号数相减即使结果为负数,也要被转换为对应无符号数
[/Quote]
都说无符号数了 也就不存在正负问题了 精度的理解基本是这样
annatianmu2008
2009-01-23
打赏
举报
回复
我懂了,上面几位朋友意思是,当一个表达式是2个数相减,那么表达式的结果类型不可能比这2个数类型精度低,至少一样,所以2个无符号数相减即使结果为负数,也要被转换为对应无符号数
BenjaminHuang
2009-01-23
打赏
举报
回复
很少遇到过这种用法,但是这个问题还是提醒了我:
如果不指明操作结果的数据类型,两个无符号类型的操作数,他们的计算结果也会向相同的类型转换,所以结果是负数与该类型值最大值的一个溢出表示。
但如果指明了存放结果的变量类型之后,比如:int result = strlen(x) - strlen(y) 我们就可以得到这个负数的正确表示。
这个应该是与语言特性相关的一个基础问题。
waizqfor
2009-01-23
打赏
举报
回复
[Quote=引用 4 楼 annatianmu2008 的回复:]
2楼回答我是一点没听懂,举个例子unsigned int a =10,unsigned int b = 20;请问a-b回是什么样结果呢
[/Quote]
会是一个很大的无符号数
annatianmu2008
2009-01-23
打赏
举报
回复
2楼回答我是一点没听懂,举个例子unsigned int a =10,unsigned int b = 20;请问a-b回是什么样结果呢
waizqfor
2009-01-23
打赏
举报
回复
[Quote=引用 2 楼 waizqfor 的回复:]
C/C++ code
我就没搞懂,2个无符号数相减结果就不能产生有符号数吗?
无符号的数比有符号的数精度高 不可能从无符号自动转换成有符号(编译器是不能这样干) 那样丢失精度 只能自己强制转换
[/Quote]
补充一下
strlen返回的是size_t类型
size_t有时就是unsigned int; 有时就是unsigned long;
waizqfor
2009-01-23
打赏
举报
回复
我就没搞懂,2个无符号数相减结果就不能产生有符号数吗?
无符号的数比有符号的数精度高 不可能从无符号自动转换成有符号(编译器是不能这样干) 那样丢失精度 只能自己强制转换
lbh2001
2009-01-23
打赏
举报
回复
我就没搞懂,2个无符号数相减结果就不能产生有符号数吗? ---->
即使产生有符号数符号数也会被转化为无符号数
因为strlen(x)- strlen(y)的结果为size_t类型
单片机中无
符号
数运算容易出现的问题
我们所用的单片机很有可能是16位或者8位的,这样,编程时所用的一些变量的取值范围会对我们的 运算有所限制.比如说8位的单片机无
符号
数最大值为255,有
符号
最大数为127;16位单片机无
符号
数最大值为65535,有
符号
数最大值为32767.对于32的单片机来说,因为我们一般所处理的值很少能超过有
符号
数的最大取值,所以比较少遇到下面出现的问题.
Verilog无
符号
数和有
符号
数的运算
Verilog无
符号
数和有
符号
数的运算
从外部输入4个无
符号
数,将前两个数
相
加,和存入内存30H单元;后两个数
相
减
,差存入内存31H单元。并将两个结果分别输出。
从外部输入4个无
符号
数,将前两个数
相
加,和存入内存30H单元;后两个数
相
减
,差存入内存31H单元。并将两个结果分别输出。
计算机组成原理课设.rar
从外部输入4个无
符号
数,将前两个数
相
减
,后两个数
相
加,再将两个结果进行与操作。
mysql unsigned 用法及
相
减
出现补数溢出解决方法
unsigned表示无
符号
的意思,也就是非负数,只用于整型并且unsigned 是MYSQL自定义的类型,非标准SQL。用途1是红苕说的起到约束数值的作用,2是可以增加数值范围(
相
当于把负数那部分加到正数上)。不过少用,不方便移植
C++ 语言
64,670
社区成员
250,489
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章