为什么我不能使用int的第一位?

cmp*_*ezg 0 c bit-manipulation shift

我试图使用int的所有位生成一个随机数.当我使用rand()函数时,它似乎永远不会使用第一位,所以我试图把整个东西移到一个地方.但是,当我尝试打印新移位的数字时,它总是打印4294967295,所以我猜这是一个溢出.为什么我不能使用那个位呢?有办法吗?

如果没有使用第一位,它就可以正常工作(打印是在随机数移位之前和之后):

00000100001100111111001010010111
00001000011001111110010100101110
Run Code Online (Sandbox Code Playgroud)

但如果需要第一位,则会发生以下情况:

01010110100001110011110011011111
42949672950101101000011100111100110111110
Run Code Online (Sandbox Code Playgroud)

请帮忙!!它在技术上有效,它只是先输出数字......

 typedef struct{
    int blocks[NUM_BLOCKS];
} WWord;

void printbits(unsigned int n){
    int i;
    //printf("%u = ",n);
    for(i=SIZE_OF_INT*SIZE_OF_BYTE-1;i>=0;i--){
        int mask = 1<<i;
        int maskedn = n&mask;
        int thebit = maskedn >> i;
        printf("%u",thebit);
    }
    printf("\n");
}

void fillword(WWord *word){
    int i;
    for(i=0; i<NUM_BLOCKS;i++){
        unsigned int ran = rand();
        printbits(ran);
        ran = ran<<1;
        printbits(ran);
        word->blocks[i] = ran;
        //word->blocks[i]<<1;
        printf("\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

hal*_*lit 5

看来你在printbits函数中使用int而不是unsigned int.所以它将它转换为使用MSB作为符号位的signed int.将那些int更改为unsigned int它将起作用.

更改您的功能如下:

void printbits(unsigned int n){
    int i;
    //printf("%u = ",n);
    for(i=SIZE_OF_INT*SIZE_OF_BYTE-1;i>=0;i--){
        unsigned int mask = 1u<<i;
        unsigned int maskedn = n&mask;
        unsigned int thebit = maskedn >> i;
        printf("%u",thebit);
    }
    printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

  • 建议`1 << i;` - >`1u << i;`以避免实现定义的行为. (2认同)