问题描述
我知道在limit.h文件里有对应的类型所能表示的最大最小的范围,例如如下程序.
void printlimits(){ printf('signed char min=%dn',SCHAR_MIN); printf('signed char max=%dn',SCHAR_MAX); printf('signed short min=%dn',SHRT_MIN); printf('signed short max=%dn',SHRT_MAX); printf('signed int min=%dn',INT_MIN); printf('signed int max=%dn',INT_MAX); printf('signed long min=%ldn',LONG_MIN); printf('signed long min=%ldn',LONG_MAX); printf('unsigned char max=%un',UCHAR_MAX); printf('unsigned short max=%un',USHRT_MAX); printf('unsigned int max=%un',UINT_MAX); printf('unsigned long max=%lun',ULONG_MAX); }
在图片上的这个方法~0>>1,如果是8位的话变成,11111111,然后右移移位,变成01111111,转换成负数后应该再减去1才是能表示的最小数吧?数上直接这么写的,难道有什么玄机呢8位不是-128-127吗?
问题解答
回答1:请直接查阅汇编码
回答2:对不起,没看清题。那我现在再跟你解释一下,~0>>1 后 为 0111 1111 此时是无符号数,再将它转为 有符号数不变 0111 1111 补码表示 因为是正数也就是 127 取负后 你觉得应该是 -128嘛?