【发布时间】:2022-01-02 04:29:27
【问题描述】:
我收到 test1 的“班次计数 >= 类型宽度”警告,但 test3 没有收到同样的警告。所有测试似乎都有效,并且铸造摆脱了警告。但是,我不明白为什么我没有收到关于 test3 的类似警告。
test1 和 test2 在我的机器上是 64 位长类型,而 test3 和 test4 在我的机器上是 32 位 int 类型。我使用与此类似的代码来打包/解包数据以通过网络发送。我已经重写了它以适应这个问题。
unsigned char arr1[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char arr2[4] = {0xFF, 0xFF, 0xFF, 0xFF};
long test1;
long test2;
int test3;
int test4;
// Gives warning: shift count >= width of type
test1 = (arr1[0] << 56) | (arr1[1] << 48) | (arr1[2] << 40) | (arr1[3] << 32)
| (arr1[4] << 24) | (arr1[5] << 16) | (arr1[6] << 8) | arr1[7];
printf("Test 1: %lX\n", test1);
// No warning
test2 = ((long)arr1[0] << 56) | ((long)arr1[1] << 48) | ((long)arr1[2] << 40)
| ((long)arr1[3] << 32) | ((long)arr1[4] << 24) | ((long)arr1[5] << 16)
| ((long)arr1[6] << 8) | (long)arr1[7];
printf("Test 2: %lX\n", test2);
// No warning. Shouldn't this give a warning?
test3 = (arr2[0] << 24) | (arr2[1] << 16) | (arr2[2] << 8) | arr2[3];
printf("Test 3: %X\n", test3);
// No warning
test4 = ((int)arr2[0] << 24) | ((int)arr2[1] << 16) | ((int)arr2[2] << 8)
| (int)arr2[3];
printf("Test 4: %X\n", test4);
【问题讨论】:
标签: c compiler-warnings bit-shift