在C中为unsigned int分配一个大数字

nek*_*rog 2 c unsigned-integer

我试图为unsigned int分配一个数字,但它会导致错误.我想只要数字介于0和2 ^ 32之间,它应该可以工作.这是我的代码.

unsigned int number = 4026658824;
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误.

错误:根据1999 ISO C标准不断推广

P.P*_*.P. 5

十进制常量的类型取决于它可以表示的类型,根据6.4.4.1整数常量:

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

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

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

您可以使用uU后缀或投射它unsigned int.u如果整数常量具有更大的值,则后缀可能不起作用.例如,如果17179869184u无法表示,unsigned int则其类型可能是unsigned long int或者unsigned long long int您仍然可以获得有关它的诊断信息.

  • @StoryTeller如果你扔掉足够多的邪恶宏,那么在C中一切皆有可能!这是不是一个真正的严肃的建议,但是...宏`#定义UINT_DECLARE_INIT(名称,位值)UINT ##位## _牛逼的名字= UINT ##位## _C(值)`作为`UINT_DECLARE_INIT (你好,32,4123456789);`将扩大到`uint32_t的你好= UINT32_C(4123456789);`这又扩展为`uint32_t的你好=(4123456789U);`.现在可以安全地匹配变量类型和文字.虽然手动使用`UINT32_C`当然可能更明智:) (2认同)
  • @StoryTeller在我看来,严格的解决方案是在你去的时候要小心类型,总是考虑整数常量会得到哪种类型.然后在代码上运行静态分析.如果有一些静态分析器擅长的东西,它就会抱怨隐式整数转换.例如,任何MISRA-C检查器都会对原始代码抱怨,如果只是告诉你使用`u`后缀. (2认同)