按位运算的结果超出了最大可能值

问题描述 投票:0回答:1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define COUNTS 1000000

int f2() 
{
    struct timespec ts;

    if (clock_gettime(CLOCK_REALTIME, &ts) == -1) 
    {
        perror("clock_gettime");
        return 1;
    }
    
    srand(ts.tv_nsec);

    int num;
    do
    {
        num = (int)((double) (rand() / ((double)RAND_MAX + 1.0))*5) + 1;
    } while (num == 3);

    return (num > 3) ? 1 : 0;
}


int f3()
{
    printf("a. %d\n",(f2()<<2 + f2()<<1 + f2()));
    printf("b. %d\n",((int)(f2()<<2) + (int)(f2()<<1) + (int)f2()));
    return ((int)(f2()<<2) + (int)(f2()<<1) + (int)f2());
    // return (f2()<<2 + f2()<<1 + f2());
}

int main()
{
    for (int i = 0; i < COUNTS; i++)
    {
        f3();
    }

    return 0;
}

当我运行上面的程序时,它会打印

a. 8
b. 3
a. 0
b. 6
a. 16
b. 1
a. 16
b. 1
a. 0
b. 6
a. 0
b. 6
a. 32
b. 0
a. 32
b. 4
a. 32
b. 6
a. 0
b. 0
a. 16
b. 7
a. 16
b. 5
a. 0
b. 4
a. 8
b. 6
a. 8
b. 1
a. 32
b. 3
a. 16
b. 7
a. 0
b. 7
a. 0
b. 2
a. 16
b. 2
a. 32
b. 6
a. 0
b. 6
a. 0
b. 3
a. 0
b. 1
a. 8
b. 4
a. 0
b. 2
a. 16
b. 4

当我运行上面的程序时,打印如下。我确保f2函数只返回0和1,并且调用f2函数后,执行按位运算。为什么第一个printf打印16和32,即使f2全部返回1,最大值也应该只有7?第二个 printf 的返回值看起来是正确的。这是为什么

我所在的平台是Ubuntu 20.04

我想知道是否有这样的结果发生

c linux
1个回答
0
投票

如果您打开警告,编译器会告诉您(至少我的是这样):

$ gcc -Wall 1.c
1.c: In function ‘f3’:
1.c:31:31: warning: suggest parentheses around ‘+’ inside ‘<<’ [-Wparentheses]
     printf("a. %d\n",(f2()<<2 + f2()<<1 + f2()));
                             ~~^~~~~~
1.c:31:41: warning: suggest parentheses around ‘+’ inside ‘<<’ [-Wparentheses]
     printf("a. %d\n",(f2()<<2 + f2()<<1 + f2()));
                                       ~~^~~~~~

这是一个优先级问题!加法发生在位移位之前。使用括号来修复它。

    printf("a. %d\n",((f2()<<2) + (f2()<<1) + f2()));
© www.soinside.com 2019 - 2024. All rights reserved.