unsigned 与signed 进行运算?是怎么处理的

longbaoer_1215 2011-09-21 11:44:44

#include <stdio.h>
void main(int argc,char** argv){
unsigned int a=6;
int b=-20;
printf("a+b=%d\n",a+b);
(a+b>6)?puts(">=6"):("<6");
}

运行结果:
longbaoer@ubuntu:~/Desktop$ gcc sign.c -o sign.out
sign.c: In function ‘main’:
sign.c:6:21: warning: pointer/integer type mismatch in conditional expression
longbaoer@ubuntu:~/Desktop$ ./sign.out
a+b=-14
>=6
longbaoer@ubuntu:~/Desktop$

我老觉得很怪?明显-14<6嘛,选择表达式应选后进呀,怎么还选前者呢?请高手指点。。。
...全文
554 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
longbaoer_1215 2011-09-21
  • 打赏
  • 举报
回复
我以为是编译环境的问题,我把它在windows 7下进行也同样的结果:

Setting environment for using Microsoft Visual Studio 2010 x86 tools.

d:\program files\microsoft visual studio 10.0\vc\bin>cl d:\zlc_work\sign.c
用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 16.00.30319.01 版
版权所有(C) Microsoft Corporation。保留所有权利。

sign.c
d:\zlc_work\sign.c(6) : warning C4047: “:”:“int”与“char [3]”的间接级别不同

Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.

/out:sign.exe
sign.obj

d:\program files\microsoft visual studio 10.0\vc\bin>sign.exe
a+b=-14
>=6

d:\program files\microsoft visual studio 10.0\vc\bin>


求高手指点,,谢谢
whitecarnation 2011-09-21
  • 打赏
  • 举报
回复
因为unsigned int和int相加的结果是unsigned int
如果想要正确地结果
可以改成
unsigned int a=6;
int b=-20;
int c=a+b;
printf("a+b=%d\n",c);
(c>6)?puts(">=6"):("<6");
longbaoer_1215 2011-09-21
  • 打赏
  • 举报
回复
我明白了,是因为输出语句的问题
printf("a+b=%d\ta+b=%u\n",a+b,a+b);
(a+b>6)?puts(">=6"):puts("<6");
%d:signed 十进制整数
%u:unsigned 十进制整数
longbaoer_1215 2011-09-21
  • 打赏
  • 举报
回复
对不起,条件运算应该是如下

(a+b>6)?puts(">=6"):puts("<6");
longbaoer_1215 2011-09-21
  • 打赏
  • 举报
回复
如果按unsigned int算 ,结果应该也应该是一个很大的数,那为什么前面a+b输出的值是-14呢?既然是unsigned int结果怎么成一个signed int呢?
赵4老师 2011-09-21
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
alcz2008 2011-09-21
  • 打赏
  • 举报
回复
对于signed右移要小心哈,加一句
 


待会给你哈
  • 打赏
  • 举报
回复

#include <stdio.h>
void main(int argc,char** argv){
unsigned int a=6;
int b=-20;
printf("a+b=%d\na+b=%u\n",a+b, a+b);
puts(((int)(a+b)>=6)?(">=6"):("<6"));
}

tempvariable 2011-09-21
  • 打赏
  • 举报
回复
是这样的,我认为

当signed int 和int相加,将int转换为unsigned int类型。

当你的int b=-20, 转化为unsigned int去掉符号可就是很大的值了。


#include <iostream>
using namespace std;

int main(void)
{
int a = -20;
cout << (unsigned int)a << endl;
return 0;
}

g++编译通过是4294967276.
VC++2010 也是这个值。
所以我觉得编译器在这个方面共识一样的。
11....1110 1100,(一共32位)对于这个二进制,理解为无符号是,这个就是很大的正数,如果理解为有符号值,就是-20了。

69,371

社区成员

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

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