【问题标题】:Declaring my int array in C在 C 中声明我的 int 数组
【发布时间】:2016-11-27 21:40:17
【问题描述】:

我想用常量值初始化一个 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};

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

static const int     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};

【问题讨论】:

  • 这些都不行。您是否只是尝试了代码并查看了结果?你需要回顾一下你对数组的理解。试试更简单的。
  • 65535 以及之后的几个错误。最好在程序启动时使用简单的for 循环填充数组。或者您可以对常量使用十六进制表示法,因为十六进制值遵循一个很好的明显模式。
  • 感谢 cmets,我在一所 it 学校,第一年禁止使用 for 循环,我不能使用十六进制,因为我需要做一个使用 Radix 对数字进行排序的程序,我将数字转换为二进制基数,然后使用升序进行排序。
  • 2 的幂的值由下式给出: static const int two_n[32] = { 1
  • 注意:const数组声明后,不能赋值。 (否则不会是const。)

标签: c arrays static int constants


【解决方案1】:

以上都不是,因为数组和初始化器的类型都不正确。使用uint32_tunsigned 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
};

【讨论】:

  • 感谢您的评论,我将使用 long 类型而不是无符号,因为我还需要负值。
  • @MohammedBRAHMI:如果 long 类型是 32 位宽,它不能容纳 2^31。你需要long long,它保证至少能容纳2^63-1
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2013-06-19
  • 1970-01-01
  • 2016-05-15
相关资源
最近更新 更多