关于char的溢出问题

现在看下面的问题

int main()
{
    char number = 129;
    printf(“number=%d\n”, number);
    return 0;
}

结果为什么是-127?

int main()
{
    char number = -129;
    printf(“number=%d\n”, number);
    return 0;
}

结果为什么是127?

解析:首先要知道三点
第一点:大家知道char类型的取值范围是-128到127,这是char类型的存储空间限制的。char类型的变量占1个字节,最高位为符号位,0代表正数,1代表负数。这样char类型最大为(0111 1111)即127.存储范围不再它的取值范围的话会造成溢出。

第二点:数值数据在内存中是以数据的补码形式存放的,比如存放一个正整数127,由于正数的补码就是源码,所以存放在内存中即为0111 1111.而如果要存放一个负数-2,系统会首先得到该负数的补码(取绝对值后取反,再加1)即1111 1110,再保存存储起来。读取的时候执行相反操作。

第三点:char类型的变量在使用时系统会将其扩展为int类型,高24位补符号位。变量的正负通过扩展的24位决定,1代表负数,0代表整数。

结果:char number = 129时,赋值给number后,number代表的存储空间中存储的是1000 0001,但取出来的时候,因符号位是1,系统认为他是一个负数的补码,1000 0001其实就是-127的补码,故第一个输出的是-127;

char number = -129时,number代表的存储空间是0111 1111,因为,-129的原码是1 1000 0001,反码是1 0111 1110 ,补码是1 0111 1111.系统读低8位,也就是0111 1111,认为是一个正数,而0111 1111是127的补码,故输出127.

总述:可以这么理解:跟时钟的原理一样,绕圈圈,129时溢出了,比127多了2,则绕回2个,到了-127;num等于-129时,比-128少1,则绕回了127.

(0)

相关推荐