【问题标题】:Assign a big number to unsigned int in C在 C 中为 unsigned int 分配一个大数字
【发布时间】:2017-06-26 03:38:37
【问题描述】:

我正在尝试为 unsigned int 分配一个数字,但这会导致错误。 我认为只要数字在 0 到 2^32 之间,它就可以工作。 这是我的代码。

unsigned int number = 4026658824;

但是,我得到了这个错误。

错误:根据 1999 ISO C 标准提升的常量

【问题讨论】:

  • unsigned int 在 [0, 2^32-1] 范围内。
  • @YuriyIvaskevych 是的那又怎样?问题与 unsigned int 无关,而是与编译器为整数常量选择的类型的规则有关。更好的编译器警告应该是:“警告:从 long int 到 unsigned int 的隐式转换”。
  • 您在哪个编译器中使用了哪些编译选项?看起来他们很挑剔(这很好!)。基本上,在数字末尾加一个 U 就可以了。
  • @YuriyIvaskevych 2^32 = 4.29*10^9。 OP 正在尝试存储比这更小的数字,4.03*10^9
  • @Lundin - 是的,它甚至比2^32 - 1 还要小,但是 OP 对 32 位无符号整数的范围有一个误解,Yuriy 指出了这一点。只要是评论而不是试图回答问题,这没什么错。

标签: c unsigned-integer


【解决方案1】:

除了上面的答案之外,如果您希望变量绝对是一定数量的位,请使用Fixed-width integer types。做嵌入式工作我们必须小心这一点(CPU 可能只有 8 位或 16 位),所以几乎总是将它们用于所有事情。

【讨论】:

  • 虽然建议很好,但这并不能真正回答问题。 uint32_t number = 4026658824; 会给出相同的诊断。要使用 stdint 类型避开诊断,您必须编写 uint32_t number = UINT32_C(4026658824);
  • 因此“在除了上面的答案......”
【解决方案2】:

十进制常量的类型取决于它可以表示的类型,每个6.4.4.1 Integer constants

整数常量的类型是对应列表中第一个可以表示其值的类型。

(请参阅链接中的表格,了解 C 语言如何推导出 actual 类型的整数常量)。

通常,带符号的 int 不能表示值 4026658824。所以,4026658824 可能在您的系统上有 long intlong long int 类型。如果unsigned int 可以代表4026658824 那么这很好,但你的编译器很谨慎。

您可以使用uU 后缀或将其转换为unsigned int。如果整数常量的值较大,则后缀u 可能不起作用。例如,如果17179869184u 不能用unsigned int 表示,那么它的类型可能是unsigned long intunsigned long long int,您仍然可能得到关于它的诊断。

【讨论】:

  • 我希望有一种方法可以确保变量的类型与文字的类型相同。 GCC 有 typeof 可以包装在宏中,但它是非标准的 :(.
  • @StoryTeller,最好根据程序的需要选择适当的目标类型,并确保为所需的类型适当地表达常量。该标准有特定的rules for how the type of an integer constant is determined
  • @StoryTeller,如果程序的需要是由常量的值决定的,那么C有显式宽度和最小宽度类型。例如,可以将变量声明为uint_least32_t(来自stdint.h)。这不会改变以适当形式表达常量的需要。
  • @StoryTeller 如果你在 C 中抛出足够多的邪恶宏,一切皆有可能!!!这并不是一个严肃的建议,但是...用作UINT_DECLARE_INIT(hello, 32, 4123456789); 的宏#define UINT_DECLARE_INIT(name, bits, value) uint ## bits ##_t name = UINT ## bits ## _C (value) 将扩展为uint32_t hello = UINT32_C(4123456789);,而uint32_t hello = UINT32_C(4123456789); 又扩展为uint32_t hello = (4123456789U);。变量类型和文字现在安全匹配。当然,手动使用UINT32_C 可能更明智:)
  • @StoryTeller 在我看来,严肃的解决方案是小心处理类型,始终考虑整数常量将获得哪种类型。然后对代码进行静态分析。如果静态分析器擅长什么,那就是隐式整数转换。例如,任何 MISRA-C 检查器都会抱怨原始代码,如果只是告诉您使用 u 后缀。
猜你喜欢
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2013-08-08
  • 2012-10-10
  • 2012-12-15
  • 2015-01-19
相关资源
最近更新 更多