【问题标题】:Is c++ still saving a "reference of the original value"?c++ 是否仍在保存“原始值的引用”?
【发布时间】:2020-05-17 16:48:07
【问题描述】:

我正在学习 C++,我有这个代码:

long long unsigned number;
cout << "Introduce a non negative number: \n";
cin >> number;
cout << "The number is equal to: " << number << endl;
cout << number*number;

当我引入负值时,例如 -1 消息显示数字等于 18446744073709551615,这很好,因为我将 long 定义为非负数,所以这个数字有点像错误。

对我来说奇怪的是数字的平方给出了正确的值,即在 -1 作为输入的情况下为 1。

尽管键盘输入的数据在数据类型(无符号)方面不正确,但 C++ 继续给出原始输入值 (-1),就好像它存储在某个地方一样。

那么,C++ 将这个值保存在哪里呢?我怎样才能得到它?

同样,如果我将正方形保存为:

int a = number*number,以输入-1为例,a = 1

但是当我执行cout &lt;&lt; a/n; 时,它显示 0 而不是 1/1 = 1(我想这与此有关)

【问题讨论】:

标签: c++


【解决方案1】:

这是因为模运算。当您将-1 分配给一个无符号数时,它会以2^n - 1 形式的数字存储(n 取决于架构,但它是该类型的最大可能正数)。

对这种类型的值的所有操作都遵循相同的模运算。所以当你乘以 2 -1s 时,你实际上是在做:

=> (2^n - 1) x (2^n - 1) mod 2^n
=> 2^(2n) -2^(n+1) + 1 mod 2^n
=> 1 mod 2^n  

解释1的结果。

请注意,该程序-1的值保存在任何地方,您看到的结果纯粹是由于模运算规则。

【讨论】:

  • 我有点惊讶甚至发生了读取。格式化的输入需要一个无符号整数,当 OP 输入 -1 时它显然没有得到一个。
  • @StoryTeller-UnslanderMonica 嗯,似乎从 c++17 开始,cin 保证读取-1,并通过将其传递给strtoull 来分配给定的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
相关资源
最近更新 更多