c - 按位左移正在将我的变量的值变为负数
问题描述
所以我试图将这些值左移以将所有这些数据存储为 64 位值。不幸的是,数字在第一个班次就变成了负数,这是什么原因造成的?不是只假设将 mil_t 时间的前 41 位存储到 x 中吗?另外为什么序列号和用户名的其余部分为零?
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
来显示x
和tbusMod
。
30000 除以 10000 得出商 3,余数 0 。