【问题标题】:Which operators are defined for each of the base types?为每种基本类型定义了哪些运算符?
【发布时间】:2013-10-02 20:45:53
【问题描述】:

使用过 C# 后,我惊讶地发现 C++ 浮点数没有定义取模运算符。显然也不是按位运算符。我决定了解更多信息,并开始寻找一张图表,其中列出了哪些基本类型为它们定义了运算符,哪些没有,但我找不到任何类似的东西。

我知道所有运算符是什么以及如何重载它们: http://en.wikipedia.org/wiki/C%2B%2B_operators

但是,我不知道为每种基本类型定义了哪些运算符。

【问题讨论】:

  • 不是在语言规范里吗?也许不是全部都在一个地方,但是如果您查看每种类型的部分,我希望它会说明定义了哪些运算符。
  • 将 fmod() 用于浮点模数。并且按位运算符对您的浮点表示过于具体(尾数和指数之间的分配,许多操作系统允许您在运行时更改)。
  • @Bathsheba 哪个操作系统可以让你这样做?我从来没有见过一个。浮点是由 IEEE 754 和硬件定义的,而不是由操作系统定义的。

标签: c++ operators


【解决方案1】:

所有运算符都是为整数类型定义的(char、short、int、long、long long 和 enum)。对于浮点类型(float、double 和 long double),您没有 % 并且没有“按位”运算符:<<、>>、~、& 、| 和 ^,因为它们对浮点数没有多大意义。例如,您对3.3 ^ 6.8 有什么期望? [1] 还是1.9 % 13.4? [1] 浮点除法中没有“余数”,因此很难想象它实际上应该给出什么。

正如评论中提到的,fmod 与% 做了类似的事情。

[1] 这些都是反问,我不指望有人能给出一个好的答案。

【讨论】:

  • Re [1]:人们确实想出了答案,因此fmod。
  • 根据这个问题和它的链接:stackoverflow.com/questions/1723575/… 位运算可能对遗传算法中的浮点数有用。我会假设浮点数默认支持按位运算。类似于: reinterpret_cast float1 (按位运算) reinterpret_cast float2
  • 是的,使用按位运算操作浮点数的 COMPONENTS 将是有效的 - 例如通过:float f; f = 8.3f; *reinterpret_cast<int *>(&f) |= 0x80000000; 将 32 位浮点数设为负数 - 或者可以通过更改最低位来操纵尾数向下/向上舍入,或者通过提取指数并将其加一来乘以 2。但这不是对浮点数使用位操作 - 它正在更改浮点数中的位,就好像它是一个整数(或一组整数字段,真的)。
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 2021-11-30
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多