ne555lm386 发表于 2014-10-3 19:33:22

lcc编译器源码片段问题

本帖最后由 ne555lm386 于 2014-10-3 19:46 编辑

//计算16进制的值,结果保存在n中if (*token == '0' && (*rcp == 'x' || *rcp == 'X')) {      int d, overflow = 0;      while (*++rcp) {                if (map[*rcp]&DIGIT)                        d = *rcp - '0';                else if (*rcp >= 'a' && *rcp <= 'f')                        d = *rcp - 'a' + 10;                else if (*rcp >= 'A' && *rcp <= 'F')                        d = *rcp - 'A' + 10;                else                        break;                if (n&~(~0UL >> 4))   //这里判断n是否溢出,怎么判断的,请大神解释                        overflow = 1;                else                        n = (n<<4) + d;}

仰望天上的光 发表于 2014-10-3 19:33:23

0UL就是无符号数0,
~0UL就是全1,如11111...1111
~0UL >> 4,就是最高4位为0,其余位都为1,如000011...1111
~(~0UL >> 4),就是最高4位为1,其余位都为0,如111100...0000
if (n&~(~0UL >> 4))意思就是如果n的二进制表示的最高4位不都为0,则。。。
至于这样判断的根据,上述代码给的信息量不足,无法描述。

JayChen 发表于 2014-10-3 20:33:57

额,你能不能把程序贴完整点来看看?

ne555lm386 发表于 2014-10-3 20:40:31

JayChen 发表于 2014-10-3 20:33
额,你能不能把程序贴完整点来看看?

解释 if (n&~(~0UL >> 4)) 这句话意思就行了

网络学习 发表于 2014-10-4 02:20:19

期待大侠指导    学习

ne555lm386 发表于 2014-10-4 11:28:19

仰望天上的光 发表于 2014-10-3 19:33
0UL就是无符号数0,
~0UL就是全1,如11111...1111
~0UL >> 4,就是最高4位为0,其余位都为1,如000011...1 ...

恩,不错,我懂了
页: [1]
查看完整版本: lcc编译器源码片段问题