首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言 或演算 细节 溢出

2013-03-22 
C语言 或运算 细节 溢出printf(%d\n,(-214783648)|1)/*-214783647在int为4z字节时的二进制真值是1111 1

C语言 或运算 细节 溢出
C语言 或演算 细节 溢出

printf("%d\n",(-214783648)|1);

/*-214783647在int为4z字节时的二进制真值是1111 1111 1111 1111 1111 1111 1111 1111;所以-214783648为1000 0000 0000 0000 0000 0000 0000 0000,此已经验证过,用printf("%d\n",1<<31)*/

这个语句的输出为什么为:

-214783647

(能理解这个问题的就帮帮我吧!另外,我是在32位win7下DEVCPP以及32位win7下visual studio2010下跑的程序)
C语言?或运算?细节?溢出
[解决办法]
显然楼主从头错到尾.

[root@vps616 cpp]# ./main 
hex=80000000 dec=-2147483648
hex=80000001 dec=-2147483647
[root@vps616 cpp]# cat main.cpp 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *const argv[]) 
{
    int n = 1 << 31;
    printf("hex=%x dec=%d\n", n, n);
    n 
[解决办法]
= 1;
    printf("hex=%x dec=%d\n", n, n);
    return 0;
}


1<<31是最小的负数, 
[解决办法]
1, 实际等于+1, 你自己算一下两个结果的补码, 都是正确的.
[解决办法]
二进制 1111 1111 1111 1111 1111 1111 1111 1111 ,它的值是-1,
算法是这样:
-2^31+2^30+2^29+2^28+.......+2^1+2^0;

热点排行