unsigned int 和int 型混合运算时的优先级问题~!

sy_lixiang 2009-04-12 09:42:49
#include <stdio.h>

main()
{
int a,b,c,d;
unsigned int u;
a=12;
b=-24;
u=10;
c=a+u;
d=b+u;
printf("a+u=%d,b+u=%d\n",c,d);
}

上面的程序运行后,d的值应该是多少呢?在运行d=b+u时候,是把b转化为unsigned型的呢还是把u转化为int型的呢?

也就是说:unsigned int和 signed int进行混合运算时,是谁转化为谁?

潭浩强C语言第二版P54页有一个优先级的图,这个图写的是int->unsigned,这对吗?
...全文
867 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmswxpmyl 2010-10-08
  • 打赏
  • 举报
回复
学习了啊 !!!这在笔试题中经常遇到
  • 打赏
  • 举报
回复
学习了
hjjdebug 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sy_lixiang 的回复:]
(-24)=(1111 1111 1110 1000)
(10) =(0000 0000 0000 1010)

+

(1111 1111 1111 0010)  //0x

其变量d声明为有符号数,所以把(1111 1111 1111 0010)看成是有符号的,所以是-14,所以d=-14。。。

OK,有点明白了,谢谢3楼5楼的兄弟。。。

不过,把一个负数的补码当成有符号数进行逆运算我还真有点困难哈,哈哈:)
[/Quote]
看来你有的明白了,数就在那摆着,就是以补码方式在那放着。
当最高位为0时, 无论你把它看成有符号还是无符号它们都是正数。数值相等。
当最高位为1时, 无符号把它看成正数,有符号把它看成是负数。负数以补码表示,正数也是以
补码表示,因为,正数的补码是其本身,负数的补码是其正数取反加1.
给一个有趣的计算:
0x7fffffff+1 = 0x80000000
当这个数据被看成是有符号数时,最大的整数加1变成了最小的负数。
结果出现 变量A 大于1万(举例),变量a+1小于1万的逻辑错误,这就是整数溢出错误。
hack们会利用这个技术,做点有意义的事情。
东莞某某某 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hejinjing_tom_com 的回复:]
引用 8 楼 sy_lixiang 的回复:

(-24)=(1111 1111 1110 1000)
(10) =(0000 0000 0000 1010)

+

(1111 1111 1111 0010)  //0x

其变量d声明为有符号数,所以把(1111 1111 1111 0010)看成是有符号的,所以是-14,所以d=-14。。。

OK,有点明白了,谢谢3楼5楼的兄弟。。。

不过,把一个负数的补码当成有符号数进行逆运算我还真有点困难哈,哈哈:)

看来你有的明白了,数就在那摆着,就是以补码方式在那放着。
当最高位为…
[/Quote]顶
x360995630 2009-04-13
  • 打赏
  • 举报
回复
up
yashuwa0622 2009-04-13
  • 打赏
  • 举报
回复
运算都是一样的,关键看怎么解释
sy_lixiang 2009-04-12
  • 打赏
  • 举报
回复
转换规则依据 = 左侧而定。

上面的这句很重要哦。。。

问题很简单,麻烦大家了。。。我会努力的。。
sy_lixiang 2009-04-12
  • 打赏
  • 举报
回复
转换规则依据 = 左侧而定。

上面的这句很重要哦。。。

问题很简单,麻烦大家了。。。我会努力的。。
sy_lixiang 2009-04-12
  • 打赏
  • 举报
回复
(-24)=(1111 1111 1110 1000)
(10) =(0000 0000 0000 1010)

+

(1111 1111 1111 0010) //0x

其变量d声明为有符号数,所以把(1111 1111 1111 0010)看成是有符号的,所以是-14,所以d=-14。。。

OK,有点明白了,谢谢3楼5楼的兄弟。。。

不过,把一个负数的补码当成有符号数进行逆运算我还真有点困难哈,哈哈:)
joyyq 2009-04-12
  • 打赏
  • 举报
回复
应该是先将unsigned int转换为int,而int 到 unsigned的转换行为是不可预知的
morris88 2009-04-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sy_lixiang 的回复:]
楼上兄弟,有一点不太明白,把b提升为unsigned int,-24那提升为int后,其值该是多少呢?是怎样提的呢?什么规则呢?
(-24)=(1111 1111 1110 1000)
(10) =(0000 0000 0000 1010)

这个小问题没太搞明白。。。
[/Quote]

书上写的是对的。就这个例子而言:
d=b+u;

肯定先计算 b + u,所以就需要进行算术转换,转换规则就如书上说的,都提升到 unsigned int;最后进行赋值转换,转换规则依据 = 左侧而定。
这个貌似一般c/c++书上都会讲吧,属于最基本的啦,没有任何意思...
hjjdebug 2009-04-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sy_lixiang 的回复:]
楼上兄弟,有一点不太明白,把b提升为unsigned int,-24那提升为int后,其值该是多少呢?是怎样提的呢?什么规则呢?
(-24)=(1111 1111 1110 1000)
(10) =(0000 0000 0000 1010)

这个小问题没太搞明白。。。



[/Quote]
计算机里并不特别区别正负数,它的计算标志既有无符号数运算标志carry,也有有符号数运算
标志 overflow sign,所以数据运算下来,全看你对它的解释。
(1111 1111 1110 1000) 看成无符号数是0xffffffe8
看成有符号数是 -24

没有骗你,慢慢体会! 所以就看左值是怎么声明的
hylove9494 2009-04-12
  • 打赏
  • 举报
回复
unsigned int 比 int 大
hjjdebug 2009-04-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 sy_lixiang 的帖子:]
#include <stdio.h>

main()
{
int a,b,c,d;
unsigned int u;
a=12;
b=-24;
u=10;
c=a+u;
d=b+u;
printf("a+u=%d,b+u=%d\n",c,d);
}

也就是说:unsigned int和 signed int进行混合运算时,是谁转化为谁?

潭浩强C语言第二版P54页有一个优先级的图,这个图写的是int->unsigned,这对吗?
[/Quote]
书上怎么写的我不知道,实际上并不存在谁转化为谁的问题,因为
数据就按它本来的方式存储,按它本来的面目进行加法运算,最后得出一个本来的数据。
结果,如果你声明它是一个符号数,它就按符号数打印,如果你声明它为一个无符号数
它就按无符号数打印。
例如: result=0xffffffff (本来面目)
如果你声明result是int, 则其值为-1 (对负数的解释是按补码来进行的)
声明result是unsiged int, 其值是最大的那个整数,叫4294967295
sy_lixiang 2009-04-12
  • 打赏
  • 举报
回复
楼上兄弟,有一点不太明白,把b提升为unsigned int,-24那提升为int后,其值该是多少呢?是怎样提的呢?什么规则呢?
(-24)=(1111 1111 1110 1000)
(10) =(0000 0000 0000 1010)

这个小问题没太搞明白。。。


morris88 2009-04-12
  • 打赏
  • 举报
回复

d=b+u; // 先将 b 提升为 unsigned int,然后和 u 相加得结果,再将结果进行隐式类型转换为 int...

33,319

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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