70,005
社区成员




void main(void)
{
int a=-2147483648;
int b=-a;
printf("a=%d, b=%d\n",a,b);
}
void main(void)
{
int a=2147483647;
int b=-a;
printf("a=%d, b=%d\n",a,b);
}
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
int型的范围是-2^32 ~ 2^32 -1 ;
当你的数大于2^32-1也就越界了!出现了负数!
至于为什么,是因为计算机中都是采用补码的形式来表示负数的,
最高位是1为则为负数,0则表示正数!
当2^32-1刚好在计算机中是0111 1111 1111 1111 1111 1111 1111 1111
再比这个数大的话,向最高位进位,也就负数为1了