#include <stdio.h>
int main()
{
int max_int = (1<<31) - 1; //第一位是符号位
printf("The max value of int on 32 machine: %d\n", max_int);
unsigned int max_uint = 0 - 1; //补码 -1 和 max - 1是一样的表示方式
printf("The max value of unsigned int on 32 machine: %u\n", max_uint);
}
会报 [Warning] integer overflow in expression [-Woverflow]
运行结果如图
补码计算法定义:非负数的补码是其原码本身;负数的补码是其绝对值的原码最高位符号位不变,其它位取反,再加1。
补码为什么是用取反+1 (大学老师的缩减式讲法)
我的理解:x的补码就是mod+x = mod - (-x),所以x是正数的时候,其补码是原码,当x是负数的时候,不看符号位的话,x的反码就是mod - 1 + x ,再加1 就是其补码。详细的请看下面的链接,讲的比较清楚。
关于补码:我对补码的理解