在C中声明我的int数组

在C中声明我的int数组,c,arrays,static,int,constants,C,Arrays,Static,Int,Constants,我想用常量值初始化一个int数组,所有的2^n值从2^0到2^31,我想知道下面的哪个方法是正确的,它是否给出了我想要的结果,是否有更简单或更短的方法来初始化它 static const char two_n[32]; two_n[32] = {1, 2 ,4 ,8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65535, 131070, 262140, 524280,

我想用常量值初始化一个int数组,所有的2^n值从2^0到2^31,我想知道下面的哪个方法是正确的,它是否给出了我想要的结果,是否有更简单或更短的方法来初始化它

static const char     two_n[32];

two_n[32] = {1, 2 ,4 ,8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096,
               8192, 16384, 32768, 65535, 131070, 262140, 524280, 1048560,
               2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728,
               268435456, 536870912, 1073741824, 2147483648};


以上两种情况都不正确,因为数组类型和初始值设定项都不正确。使用
uint32\u t
unsigned long
,因为它们保证至少32位宽,并且能够保持231的值,这可能超出
int
的范围:

static const unsigned long two_n[32] = {
    1UL <<  0, 1UL <<  1, 1UL <<  2, 1UL <<  3,
    1UL <<  4, 1UL <<  5, 1UL <<  6, 1UL <<  7,
    1UL <<  8, 1UL <<  9, 1UL << 10, 1UL << 11,
    1UL << 12, 1UL << 13, 1UL << 14, 1UL << 15,
    1UL << 16, 1UL << 17, 1UL << 18, 1UL << 19,
    1UL << 20, 1UL << 21, 1UL << 22, 1UL << 23,
    1UL << 24, 1UL << 25, 1UL << 26, 1UL << 27,
    1UL << 28, 1UL << 29, 1UL << 30, 1UL << 31
};
static const unsigned long two_n[32]={

1UL以上两项都不正确,因为数组类型和初始值设定项都不正确。请使用
uint32\t
无符号长
,因为它们保证至少32位宽,并且能够保持231的值,这可能超出
int
的范围:

static const unsigned long two_n[32] = {
    1UL <<  0, 1UL <<  1, 1UL <<  2, 1UL <<  3,
    1UL <<  4, 1UL <<  5, 1UL <<  6, 1UL <<  7,
    1UL <<  8, 1UL <<  9, 1UL << 10, 1UL << 11,
    1UL << 12, 1UL << 13, 1UL << 14, 1UL << 15,
    1UL << 16, 1UL << 17, 1UL << 18, 1UL << 19,
    1UL << 20, 1UL << 21, 1UL << 22, 1UL << 23,
    1UL << 24, 1UL << 25, 1UL << 26, 1UL << 27,
    1UL << 28, 1UL << 29, 1UL << 30, 1UL << 31
};
static const unsigned long two_n[32]={

1所有这些都不起作用。你只是尝试了代码并看到了结果吗?你需要回顾一下你对数组的理解。尝试一些更简单的方法。65535是错误的,之后还有一些方法。你最好在程序启动时用一个简单的
for
循环填充数组。或者你可以对常量使用十六进制表示法nts,因为十六进制值遵循一个很好的明显模式。谢谢你的评论,我在一所it学校,那里第一年禁止使用for循环,我不能使用十六进制,因为我需要做一个程序,用基数对数字进行排序,我将数字转换为二进制,然后用升序进行排序。这些值因为2的幂由以下公式给出:static const int two_n[32]={1注意:在声明
const
数组后,不能将其赋值。(否则它将不是
const
)所有这些都不起作用。你只是尝试了代码并看到了结果吗?你需要回顾一下你对数组的理解。尝试一些更简单的方法。65535是错误的,之后还有几个。你最好在程序启动时用一个简单的
for
循环填充数组。或者你可以对常量使用十六进制表示法,因为十六进制值遵循一个很好的明显的模式。谢谢你的评论,我在一所it学校,那里第一年禁止使用for循环,我不能使用十六进制,因为我需要做一个程序,用基数对数字进行排序,我正在将数字转换为二进制,然后用升序进行排序2的幂由以下公式给出:static const int two_n[32]={1注意:在声明
const
数组后,不能将其赋值。(否则它将不是
const
)感谢您的评论,我将使用long-type和not unsigned,因为我还需要负值。@MohammedBRAHMI:If
long
type是32位宽,它不能容纳2^31。您将需要
long-long
,它保证至少能够容纳
2^63-1
,谢谢您的评论,我将使用long-type和not unsigned,因为我“我还需要负值。@MohammedBRAHMI:如果
long
类型为32位宽,则它不能容纳2^31。您需要
long
,它保证至少容纳
2^63-1
static const unsigned long two_n[32] = {
    1UL <<  0, 1UL <<  1, 1UL <<  2, 1UL <<  3,
    1UL <<  4, 1UL <<  5, 1UL <<  6, 1UL <<  7,
    1UL <<  8, 1UL <<  9, 1UL << 10, 1UL << 11,
    1UL << 12, 1UL << 13, 1UL << 14, 1UL << 15,
    1UL << 16, 1UL << 17, 1UL << 18, 1UL << 19,
    1UL << 20, 1UL << 21, 1UL << 22, 1UL << 23,
    1UL << 24, 1UL << 25, 1UL << 26, 1UL << 27,
    1UL << 28, 1UL << 29, 1UL << 30, 1UL << 31
};