C ++:大型unsigned int的编译器警告

时间:2010-02-28 20:46:10

标签: c++ int warnings unsigned

我有以下数组,我需要在位图上手动操作。

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};

不幸的是,编译后我得到了

  

警告:此十进制常量仅在ISO C90

中无符号

如何删除此内容?

3 个答案:

答案 0 :(得分:19)

默认情况下,C中的整数文字类型为“signed int”(编辑:但请参阅警告的注释)。最后一个数字太大而无法表示为带符号的32位整数,所以你需要告诉编译器它是一个无符号整数,后缀为“U”,如:

2147483648U

请注意,您还可以添加后缀“L”以使其成为“长”,但在许多系统上仍然是32位且无关紧要。

此外,使用位移运算符编写此代码的方式更容易出错(也更容易阅读):

const unsigned int BITS[32] = {1U, 1U<<1, 1U<<2, 1U<<3, 1U<<4,
                               /* and so on */
                               1U<<31};

或者,用十六进制写,如果你因为某些原因不喜欢位移:

const unsigned int BITS[32] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20,
                               /* and so on */
                               0x80000000U};

答案 1 :(得分:7)

你的常量也必须指定为无符号,使用

2147483648UL

(UL =无符号长),或简称

2147483648U

表示无符号的int。

由于您的代码现在正常,因此默认为常量int且因此已签名的常量会分配给unsigned int,从而生成警告。

答案 2 :(得分:1)

无需将数据类型定义为unsigned just type;

int variable_name=2147483648U;

否则只需将十进制值转换为十六进制......