关于无符号数相减

annatianmu2008 2009-01-23 03:51:03
小弟有个问题不明白,大家都知道库函数中计算字符串长度函数strlen返回一个类型size_t值,它是一个无符号数类型。书上说“在表达式中使用无符号数可能导致不可预料的结果”,然后举例说:
if( strlen(x)- strlen(y)>= 0 )。。。
说这个表达式结果将永远是真,strlen结果是个无符号数所以操作符>=左边的表达式也将是无符号数。
我就没搞懂,2个无符号数相减结果就不能产生有符号数吗?
请赐教,谢谢!!!
...全文
1846 12 打赏 收藏 转发到动态 举报
写回复
用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类型

64,670

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧