printf(“signed char min = %d\n”,-(char)((unsigned char)~0 >> 1));
printf(“signed char max = %d\n”,(char)((unsigned char)~0 >> 1));
问一下char类型的最小值不是应该是-128吗?为什么按书上代码来编译结果是-127
还有问一下为什么要将0的二进制取反的结果转换为unsigned char类型,并且还要算术右移一位?这样做的目的是什么?
为什么两个代码前面一个有负号一个没有呢?
printf(“signed char max = %d\n”,(char)((unsigned char)~0 >> 1));
问一下char类型的最小值不是应该是-128吗?为什么按书上代码来编译结果是-127
还有问一下为什么要将0的二进制取反的结果转换为unsigned char类型,并且还要算术右移一位?这样做的目的是什么?
为什么两个代码前面一个有负号一个没有呢?
解决方案
20
原因是需要逻辑右移,假如是转成有符号,就是算术右移,算术右移最高位还是添1,这样等于没移