【问题标题】:C++ why does this not provide the system maximum size for integer?C ++为什么不提供整数的系统最大大小?
【发布时间】:2013-02-14 09:42:20
【问题描述】:

所以,如果我理解正确的话,整数是字节的集合,它表示以二为底格式的数字。

因此,如果我有 unsigned int test=0,则应该只包含一个位字段,所有位都为零。然而,

unsigned int test=0;
test=~test;

产生-1

我原以为这会用'1' 填充所有位,从而使整数在该系统上尽可能大....

感谢您的帮助!

【问题讨论】:

  • -1 最大的无符号整数。有什么问题?
  • 这完全取决于您所说的 produces 到底是什么意思。你如何检查/输出/打印结果?
  • 我想您正在使用printf 而不是std::cout 来打印结果。所以这应该被标记为 C 而不是 C++
  • 听起来您通过将错误类型的数据传递给 printf 来调用 UB。这里真正的问题是:哪个手册告诉你传递一个无符号整数来对应一个 %d 格式说明符是可以的?
  • 这是一个微控制器...所以我真的关心效率/找出实际大小。但是,是的,@qdii,我使用的是 printf……但在 C++ 中的行为是一样的……

标签: c++ c integer bit-manipulation


【解决方案1】:

如何打印值?

如果它显示为“-1”或一个大的无符号整数只是位在打印出来时被解释的一种方式,这些位本身并不知道其中的区别。

您需要将其打印为 unsigned 值。

此外,正如其他答案所指出的,您对系统如何存储数字有很多疑问;无法保证数字与用于表示该数字的位之间存在特定的相关性。

无论如何,获取此值的正确方法是#include <climits>,然后使用UINT_MAX

【讨论】:

  • printf中使用%u而不是%d
  • std::numeric_limits怎么样?
  • 哇,谢谢大家。这清除了它。我有兴趣对此进行编程以在微控制器上运行,所以我不想使用 #includes 我不需要绝对必须。在微型计算机上进行测试,所以这一切都有帮助。谢谢!
  • @user1833028 为什么?我相信<climits> 只会添加几个定义,不会影响代码大小。
  • 当我查看代码时,我刚刚看到预定义是的......但这如何帮助计算可能没有限制的系统上的整数大小.h......不确定是否我的有或没有大声笑
【解决方案2】:

您没有正确理解。整数表示整数,仅此而已。表示的细节不是标准的一部分(除了少数例外),您没有必要假设按位运算和整数值之间存在任何相关性。

(具有讽刺意味的是,标准 通过模运算规则强制要求将 -1 转换为无符号整数 实际上是该无符号类型的最大可能值.)

更新:为了澄清,我说的是所有整数类型。如果您只使用 unsigned types(我认为您不是因为您的否定回答),那么您在按位运算和表示的值之间有明确的对应关系。

【讨论】:

  • 应该有 C/C++ 标准的机器感知分支。如此多的人依赖于编译器特定的行为,因此应该对其进行标准化。
  • “你没有必要假设按位运算和整数值之间存在任何关联。”是错的。除了少数例外(获得 UB 或实现定义结果的极端情况),按位运算与底层表示无关。
  • @R.MartinhoFernandes:我并不是反对按位运算。我说的是按位运算与对象所代表的整数值之间的相关性。你当然可以使用任何你喜欢的整数类型作为位域——只是不要问整数是什么number
  • @KerrekSB 是的,并且这种相关性是明确定义的。给定std::uint32_t x = 0;,~x 必须为 0xFFFFFFFF,无论底层表示如何
  • @KerrekSB 如果“表示的细节不是标准的一部分”即使对于有符号整数类型也是如此,那么 C99 标准中的第 6.2.6.2 条会短得多。
【解决方案3】:

您也可以使用:

unsigned int test =0;
test--;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2012-11-07
    • 2021-06-05
    相关资源
    最近更新 更多