C left shift on 64 bits fail

后端 未结 2 1815
隐瞒了意图╮
隐瞒了意图╮ 2020-11-30 13:46

I have this code in C (it\'s for study only):

    char x;
    uint64_t total = 0;

    for(x = 20; x < 30; x++){
        total = (((((1 << x) * x) /         


        
相关标签:
2条回答
  • 2020-11-30 14:43

    Because 1 is an int, 32 bits, so (1 << 27)*27 overflows. Use 1ull.

    Regarding your comment, if x is a uint64_t, then 1 << x is still an int, but for the multiplication it would be cast to uint64_t, so there'd be no overflow. However, if x >= 31, 1 << x would be undefined behaviour (as the resulting value cannot be represented by a signed 32 bit integer type).

    0 讨论(0)
  • 2020-11-30 14:43

    I guess your problem is, you calculate with 32bit and assign it later to a 64 bit value

    division by 64 is the same as not shift 6 bit

    char x;
    uint64_t one = 1;
    uint64_t total = 0;
    
    for(x = 20; x < 30; x++){
        total = ((((one << (x - 6)) * x) + 1) * sizeof(uint64_t));
        printf("%d - %llu\n", x, total);        
    }
    

    not compiled yet

    0 讨论(0)
提交回复
热议问题