当条件为假时,C输入if块

时间:2012-09-21 11:41:08

标签: c

位图排序程序,其中赋值部分为:

for(i = MAX/64-1;i >= 0;i--){
    for(j = 0;j < 64;j++){
        if(0 != (arr[i] & (1 << j))){
            *p++ = j + 64 * i;  
        }   
    }   
}

我gdb它,有时当if条件返回0并且程序仍然进入块并执行语句时:
*p++ = j + 64 *i;
这最终导致段故障,我只是不明白它会在哪种情况下发生

例如:
当gdb状态如下:
j = 44,i = 6250,arr [i] = 4096,print (arr[i] & (1 << j))给出0
但程序仍然进入块

2 个答案:

答案 0 :(得分:4)

我的猜测是你有32位整数,但你的数组数据类型是int64_t。在这种情况下,您需要更改:

    if(0 != (arr[i] & (1 << j))){

为:

    if(0 != (arr[i] & (1LL << j))){

由于1 << j j >= sizeof(int) * CHAR_BIT未定义{(1}}(例如j >= 32)。

答案 1 :(得分:3)

1 << j如果intj大于或等于CHAR_BIT * sizeof (int),则定义不明确。这可能是一个问题,因为您在示例中使用了j = 44