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

标签 c bit-manipulation shift

我正在尝试使用 int 的所有位生成一个随机数。当我使用 rand() 功能时,它似乎从来没有使用过第一位,所以我试图将整个事情转移到一个地方。但是,当我尝试打印新的移位数字时,它总是打印 4294967295,所以我猜这是一个溢出。但是,为什么我不能使用那个位?有办法吗?

如果不使用第一位,它可以正常工作,像这样(打印在随机数移位前后):

00000100001100111111001010010111
00001000011001111110010100101110

但是如果需要第一位,就会发生这种情况:

01010110100001110011110011011111
42949672950101101000011100111100110111110

请帮忙!!它在技术上是可行的,它只是先打印数字...

 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");
    }
}

最佳答案

看来您在 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");
}

关于c - 为什么我不能使用 int 的第一位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37417233/

相关文章:

c - 为什么用 C 中的 && 对值和条件进行位移后表达式为真

Mac 上的 Java 机器人按键 "shift"?

mouseevent - Haxe+OpenFL->Neko, MouseEvent.xxxKey 总是假的

c - gtk 从对话框中显示对话框

C 中执行函数的命令

bit-manipulation - Verilog 访问特定位

c++ - 拉伸(stretch)蒙版 - 位操作

c++ - 如何在 C++ 中创建一个 Bitset 数组

将 char 转换为二进制

c - recvfrom : Bad address, sendto: 协议(protocol)不支持的地址族