一个相当无语的问题,求助~~~

foxyz123 2009-04-03 03:27:01

#include <stdio.h>
#include <string.h>

void main()
{
unsigned short a = -15;
short b = -13;

if(a >= 0)
printf("0");
if(~a >= 0)
printf("1");
if(b >= 0)
printf("2");
if(~b >= 0)
printf("3");
}

结果为03,真是奇怪,有符号数不是取反符号位不变吗?怎么回事?a >= 0 这样能判断出来,为什么~a >= 0 却变成负数了?


...全文
132 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
M_S_D_N 2009-04-03
  • 打赏
  • 举报
回复
顶下!正解。
[Quote=引用 7 楼 yyyapple 的回复:]
if(a >= 0) //提升为int,0x0000FFF1 >0
printf("0");
if(~a >= 0) //提升为int,0xFFFF000E <0
printf("1");
if(b >= 0) //提升为int, 0xFFFFFFF3 <0
printf("2");
if(~b >= 0) //提升为int, 0x0000000C >0
printf("3");
[/Quote]
M_S_D_N 2009-04-03
  • 打赏
  • 举报
回复
错了。。。
[Quote=引用 6 楼 M_S_D_N 的回复:]
优先级问题。

C/C++ code
#include <stdio.h>
#include <string.h>

void main()
{
unsigned short a = -15;
short b = -13;

if(a >= 0) // a >= 0 ,所以输出0
printf("0");
if(~a >= 0) // ~(a >= 0) ,表达式值为非,所以不输出
printf("1");
if(b >= 0) // 同理
printf("2");
if(~b >= 0) // …
[/Quote]
rggh2009 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wzw200 的回复:]
C/C++ code
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
void main()
{
unsigned short a = -15;
short b = -13;


cout<<"a="<<a<<endl;
cout<<"~a="<<~a<<endl;
cout<<"b="<<b<<endl;
cout<<"~b="<<~b<<endl;

if(a >= 0)
printf("0");
if(~a >= 0)
printf("1");
if(b >= 0)
printf("2");

[/Quote]

a=65521
~a=-65522
b=-13
~b=12

为咋
maotou3169 2009-04-03
  • 打赏
  • 举报
回复
楼上的说得对,你代码上取反计算跟符号位没关系
yyyapple 2009-04-03
  • 打赏
  • 举报
回复
if(a >= 0) //提升为int,0x0000FFF1 >0
printf("0");
if(~a >= 0) //提升为int,0xFFFF000E <0
printf("1");
if(b >= 0) //提升为int, 0xFFFFFFF3 <0
printf("2");
if(~b >= 0) //提升为int, 0x0000000C >0
printf("3");
M_S_D_N 2009-04-03
  • 打赏
  • 举报
回复
优先级问题。

#include <stdio.h>
#include <string.h>

void main()
{
unsigned short a = -15;
short b = -13;

if(a >= 0) // a >= 0 ,所以输出0
printf("0");
if(~a >= 0) // ~(a >= 0) ,表达式值为非,所以不输出
printf("1");
if(b >= 0) // 同理
printf("2");
if(~b >= 0) // ~(b >= 0) ,同理
printf("3");
}

wzw200 2009-04-03
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
void main()
{
unsigned short a = -15;
short b = -13;


cout<<"a="<<a<<endl;
cout<<"~a="<<~a<<endl;
cout<<"b="<<b<<endl;
cout<<"~b="<<~b<<endl;

if(a >= 0)
printf("0");
if(~a >= 0)
printf("1");
if(b >= 0)
printf("2");
if(~b >= 0)
printf("3");
}




如果你真想知道为什么看 《计算机组成原理》
foxyz123 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 t1397018 的回复:]
你说的取反是原码转化为反码补码的时候的事,和这个没有关系
[/Quote]

如果就是按位取反的话,那为什么~a 和~b 的结果会不一样?
t1397018 2009-04-03
  • 打赏
  • 举报
回复
你说的取反是原码转化为反码补码的时候的事,和这个没有关系
t1397018 2009-04-03
  • 打赏
  • 举报
回复
~符号应该是按位取反,才不管你符号不符号位呢
foxyz123 2009-04-03
  • 打赏
  • 举报
回复
书上说是跟类型提升有关,不知道是不是因为这个,哪个能解释一下

69,381

社区成员

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

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