求解答(C语言入门者)

大恶魔先生 2012-03-13 08:54:13
# include <stdio.h>

void main (){ uigned int a=30;
int b=-130,c ;

c=(a+b) / 2;
printf("c=%d\n", c);}
运行结果为c=2147483598 (vc下)
c=32718(BC下)



# include<stdio.h)

void main int a=6;
int b=-20;

printf ("a+b=%d\n", a+b )

而运行结果为 a+b=-14
为什么a+b不等于65522或4294967282呢?


求高人指导,定感激涕零!谢谢!
...全文
301 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wopabe 2012-03-14
  • 打赏
  • 举报
回复
第二个是对了,第一个有点问题。
三尺青萍 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 okokopai 的回复:]
# include <stdio.h>

void main (){ uigned int a=30;
int b=-130,c ;

c=(a+b) / 2;
printf("c=%d\n", c);}
运行结果为c=2147483598 (vc下)
c=3271……
[/Quote]
编写错误,上面几位都提了,我也不说了。但是,运算时,低进度向高进度转换是常识问题,unsigned int应该转换成int 型的才对。(a+b)=-100,在内存中的表示为补码表示:ffffff9c,计算机中执行/2运算并不是像人计算的那样直接除以2而是执行左移运算,除以2就是左移一位,变成了7fffffce,转换成真值就是2147483598。加法运算就是补码相加,只要不越界,结果都正确,-16显然没越界
AnYidan 2012-03-14
  • 打赏
  • 举报
回复
int a=30;

google 整型提升
  • 打赏
  • 举报
回复
不同类型在做运算是要进行强制类型转换,至于转换的优先级我忘记了 你可以查查
赵4老师 2012-03-14
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

不要写连自己也预测不了结果的代码!
猪头小哥 2012-03-13
  • 打赏
  • 举报
回复
 uigned int a=30;//应该是unsigned int a = 30 吧
lanmeng521131485 2012-03-13
  • 打赏
  • 举报
回复
1是符号数和无符号数的输出问题
2是你vc下和bc下编译环境不同
muyi66 2012-03-13
  • 打赏
  • 举报
回复
第二个完全是正常结果,没什么问题啊?

第一个,uigned是什么?我把代码复制到VS2010,结果直接报错,根本没法编译。
半字节 2012-03-13
  • 打赏
  • 举报
回复
打错字了。。。是运算时转化成无符号数。。
半字节 2012-03-13
  • 打赏
  • 举报
回复
其实第二个应该好理解

第一个测试是因为a是无符号数 b是有符号数,在进行运算时都转换为有符号数

uigned int a=30;
int b=-130,c ;

c=(a+b) / 2;

a+b=-100 但是作为无符号数就是0xFFFFFFFF-(100)D
然后除以2 复制给c 当然c就是2147483598 了

而你下面第二个例子 没有有符号数和无符号数之间的转化

如果你想验证 可以把第二个例子这样输出
printf ("a+b=%u\n", a+b )

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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