c语言负号是怎么运算的。。。。。。?

koala0923 2013-07-31 05:41:50

void main(void)
{
int a=-2147483648;
int b=-a;
printf("a=%d, b=%d\n",a,b);
}

a=-2147483648, b=-2147483648

void main(void)
{
int a=2147483647;
int b=-a;
printf("a=%d, b=%d\n",a,b);
}

a=2147483647, b=-2147483647
为什么上面那个不变啊?负号在位上到底是怎么算的?
...全文
2479 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
大漠孤鸿 2013-08-01
  • 打赏
  • 举报
回复
void main(void)
{
        int a=-2147483648;
        int b=-a;
        printf("a=%d, b=%d\n",a,b);
}
a = -2147483648(D) = 10000000 00000000 00000000 00000000(B) -a = 2147483648(D) = 10000000 00000000 00000000 00000000(B) (发生了溢出) b= -a = -2147483648(发生了隐式类型转化) 故a=b
void main(void)
{
        int a=2147483647;
        int b=-a;
        printf("a=%d, b=%d\n",a,b);
}
a = 2147483647(D) = 01111111 11111111 11111111 11111111(B) -a = -2147483647(D) = 10000000 00000000 00000000 00000001(B) b= -a = -2147483647
koala0923 2013-08-01
  • 打赏
  • 举报
回复
搞明白了。。。。 a=2147483647 (1)补码0111 1111 1111 1111 1111 1111 1111 1111 b=-2147483647 (2)补码1000 0000 0000 0000 0000 0000 0000 0001 当进行 b=-a运算时 (1)取反变成(3)1000 0000 0000 0000 0000 0000 0000 0000 再加1就成了(2) a=-b (2)取反加1变成(1) a=-2147483648 (1)补码 1000 0000 0000 0000 0000 0000 0000 0000 b=-a运算 (1)取反变成(2) 0111 1111 1111 1111 1111 1111 1111 1111 (2)+1变成 (3) 1000 0000 0000 0000 0000 0000 0000 0000 (1)=(3)所以就一样了 谢谢各位参与。。。
FancyMouse 2013-08-01
  • 打赏
  • 举报
回复
经典的x == -x && x != 0的解……
koala0923 2013-08-01
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:

int型的范围是-2^32 ~ 2^32 -1 ;
当你的数大于2^32-1也就越界了!出现了负数!

至于为什么,是因为计算机中都是采用补码的形式来表示负数的,
最高位是1为则为负数,0则表示正数!
当2^32-1刚好在计算机中是0111 1111 1111 1111 1111 1111 1111 1111
再比这个数大的话,向最高位进位,也就负数为1了
 
补码这个我知 。。。。 a=2147483647 (1)补码0111 1111 1111 1111 1111 1111 1111 1111 b=-2147483647 (2)补码1000 0000 0000 0000 0000 0000 0000 0001 就是想知道 b=-a运算时 怎么从a(1)到b(2)????
nice_cxf 2013-08-01
  • 打赏
  • 举报
回复
引用 4 楼 supermegaboy 的回复:
[quote=引用 楼主 koala0923 的回复:]

void main(void)
{
        int a=-2147483648;
        int b=-a;
        printf("a=%d, b=%d\n",a,b);
}
a=-2147483648, b=-2147483648

void main(void)
{
        int a=2147483647;
        int b=-a;
        printf("a=%d, b=%d\n",a,b);
}
a=2147483647, b=-2147483647 为什么上面那个不变啊?负号在位上到底是怎么算的?
-2147483648前面的-并不是负号,而是一元运算符,因为integer constant是没有负数的,都是非负的,2147483648才是一个integer constant,但它溢出了,通常编译器对于integer overflow采取的处理方法就是回绕,因此2147483648的结果是-2147483648,再通过-这个一元运算,就变成2147483648了。 b=-2147483647中的-才是负号。[/quote] 为啥后面数字不同,前边的-意义不同?没必要这么搞把? 个人认为2楼的解释更清晰一些
zhaokai115 2013-07-31
  • 打赏
  • 举报
回复
传说中的补码
酱油小龟 2013-07-31
  • 打赏
  • 举报
回复
引用 2 楼 lilin_colin 的回复:
int 的范围 [-2147483648,2147483647] 负变正,自己也能看出来超出了上确界吧?
++ 言之有理
飞天御剑流 2013-07-31
  • 打赏
  • 举报
回复
引用 楼主 koala0923 的回复:

void main(void)
{
        int a=-2147483648;
        int b=-a;
        printf("a=%d, b=%d\n",a,b);
}
a=-2147483648, b=-2147483648

void main(void)
{
        int a=2147483647;
        int b=-a;
        printf("a=%d, b=%d\n",a,b);
}
a=2147483647, b=-2147483647 为什么上面那个不变啊?负号在位上到底是怎么算的?
-2147483648前面的-并不是负号,而是一元运算符,因为integer constant是没有负数的,都是非负的,2147483648才是一个integer constant,但它溢出了,通常编译器对于integer overflow采取的处理方法就是回绕,因此2147483648的结果是-2147483648,再通过-这个一元运算,就变成2147483648了。 b=-2147483647中的-才是负号。
max_min_ 2013-07-31
  • 打赏
  • 举报
回复 1

int型的范围是-2^32 ~ 2^32 -1 ;
当你的数大于2^32-1也就越界了!出现了负数!

至于为什么,是因为计算机中都是采用补码的形式来表示负数的,
最高位是1为则为负数,0则表示正数!
当2^32-1刚好在计算机中是0111 1111 1111 1111 1111 1111 1111 1111
再比这个数大的话,向最高位进位,也就负数为1了
 
绯红女王 2013-07-31
  • 打赏
  • 举报
回复
int 的范围 [-2147483648,2147483647] 负变正,自己也能看出来超出了上确界吧?
rocktyt 2013-07-31
  • 打赏
  • 举报
回复
2147483648溢出,变成-2147483648

70,005

社区成员

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

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