gru*_*czy 19 c++ int unsigned warnings
我有以下数组,我需要在位图上手动操作.
const unsigned int BITS[32] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,
2048, 4096, 8192, 16384, 32768, 65536, 131072,
262144, 524288, 1048576, 2097152, 4194304,
8388608, 16777216, 33554432, 67108864, 134217728,
268435456, 536870912, 1073741824, 2147483648};
Run Code Online (Sandbox Code Playgroud)
不幸的是,编译时我得到了
警告:此十进制常量仅在ISO C90中无符号
我该如何删除?
Bro*_*ses 20
默认情况下,C中的整数文字类型为"signed int"(编辑:但请参阅警告的注释).最后一个数字太大而无法表示为带符号的32位整数,因此您需要告诉编译器它是无符号整数,后缀为"U",如:
2147483648U
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以添加后缀"L"以使其为"long",但在许多系统上仍然是32位且因此无关紧要.
此外,使用位移运算符编写此代码的方法更容易出错(也更容易阅读):
const unsigned int BITS[32] = {1U, 1U<<1, 1U<<2, 1U<<3, 1U<<4,
/* and so on */
1U<<31};
Run Code Online (Sandbox Code Playgroud)
或者,如果你因为某些原因不喜欢位移,用十六进制写:
const unsigned int BITS[32] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20,
/* and so on */
0x80000000U};
Run Code Online (Sandbox Code Playgroud)
你的常量也必须被指定为无符号,使用
2147483648UL
Run Code Online (Sandbox Code Playgroud)
(UL =无符号长),或简单地说
2147483648U
Run Code Online (Sandbox Code Playgroud)
对于unsigned int.
由于您的代码现在是一个常量,默认情况下是一个普通的int,因而签名的,被分配给一个unsigned int生成警告的常量.