我有以下的代码:警告:左移位计数型的> =宽度[默认启用]
long int compute_data_length(unsigned char* buf, int data_offset) {
long int len;
if(!buf)
return -1;
switch(data_offset) {
case 2: {
len = (buf[2] << 8) | buf[3];
}
break;
case 8: {
len = (buf[2] << 56) |
(buf[3] << 48) |
(buf[4] << 40) |
(buf[5] << 32) |
(buf[6] << 24) |
(buf[7] << 16) |
(buf[8] << 8) |
(buf[9] );
}
break;
default: len = -1; break;
}
return len;
}
当我编译,我得到以下警告:
math_fun .c:240:21:警告:左移计数> =宽度类型[默认启用] len =(buf [2] < < 56)| ^ math_fun.c:241:27:警告:左移计数> =类型宽度[默认启用] (buf [3] < < 48)| ^ math_fun.c:242:27:警告:左移计数> =宽度类型[默认启用] (buf [4] < < 40)| ^ math_fun.c:243:27:警告:左移计数> =宽度类型[默认启用] (buf [5] < < 32)|
如何解决警告?
long int有多大?在转换之前施放到正确的类型。 – Deduplicator
-bash-4.1 $ ./a.out long int的长度8 long long 8 unsigned long 8 –
与[无符号整数位域移位产生带符号整数]密切相关(http://stackoverflow.com/questions/22152636/ unsigned-integer-bit-field-shift-yields-signed-integer/22152886#22152886),在栅栏上是否是dup。 –