按位左移将我的变量的值变为负值

Bitwise left shift is turning value of my variable negative

所以我试图将这些值左移以将所有这些数据存储到 64 位值中。不幸的是,数字在第一班就变成了负数,这是什么原因造成的?不是只假设将 mil_t 时间的前 41 位存储到 x 中吗?还有为什么serial和userid的余数会是零?

long int gen_id(){
     printf("Calling gen_id...\n");

    unsigned long int mil_t = 1623638363132;
    unsigned long int serial = 10000;
    unsigned int rowId = 5;
    unsigned int userId = 30000;

    printf("Original mil_t: %ld\n", mil_t);
    unsigned long int x = mil_t << 41;
    printf("GEN_ID | MIL_T shift left 41: %ld\n", x);
    unsigned long int tbusMod = userId % serial;
    printf("GEN_ID | tbusMod = userId mod serial: %ld\n", tbusMod);

    x += tbusMod << (64 - 41 - 13);
    printf("GEN_ID | x1 : %ld\n", x);
    x += (rowId % 1024);
    printf("GEN_ID | x2 : %ld\n", x);

    return x;
}

输出:

Original mil_t: 1623638647191

GEN_ID | MIL_T shift left 41: -4136565053832822784

GEN_ID | tbusMod = userId mod serial: 0 

GEN_ID | x1 : -4136565053832822784

GEN_ID | x2 : -4136565053832822779 

FINAL: -4136565053832822779 

TOTAL BYTES: 68

您的程序使用不正确的格式说明符导致未定义的行为。 %ld 仅适用于 long int(而非 unsigned long int)。

而是使用%lu来显示xtbusMod


30000 除以 10000 得到商 3,余数 0。