上一周,我在调试项目性能指标时遇到了一个问题,支持的节点数在到达60718644时,程序就出错了。由于节点索引是一个27位的结构体位域,当值为60718644时,最高位为1,此时,代码中有一个转换函数,作了对位域的左移操作并赋给一个更大空间类型的变量,使得最后的结果不是预期的。show u code:
printf("base rawdata 0x%x index %x\r\n", data.rawdata, data.index); //unsigned long long result = ((unsigned long long)data.index << 5) + 9; unsigned long long result = (data.index << 5) + 9; printf("result %llx %llu high32 %llx \r\n", result, result, result>>32);
Keep:test keep$ ./a base rawdata 0x80000000 index 4000000 result ffffffff80000009 18446744071562067977 high32 ffffffff result [0] 0xf0000000 [1] 0x80000009