@
winterma 补码表示中零只有一种表示,那就是0x00000000(32位情况下),没有什么正零负零的区别。
LZ可以用下面代码显示INT_MIN的十六进制表示:
printf("0x%08x\n", INT_MIN);
还有就是要注意的是,补码可表示的数字范围,负数会比正数多一个(正是因为零的存在)
0x00000000 对应 0
0x00000001~0x7fffffff 对应正数 1~2147483647
0x80000000~0xffffffff 对应负数 -2147483648~-1(注意对应顺序,是反着的)
按照上面的表将这些数字画到一个环上去,这个数环蕴含了正无穷和负无穷相接的思想
你直接写-2147483648,gcc将其认为是一个表达式,即一个负号(-)和一个立即数(2147483648),而2147483648不是32位计算机中可以直接表示的数字(数环里没有这个数字),所以gcc在编译的时候会有warning出现,并且对于这个情况会采用一些默认处理,造成了意料之外的结果。