【问题标题】:Why can't we use the '~' operator on a float为什么我们不能在浮点数上使用 '~' 运算符
【发布时间】:2020-07-30 04:43:06
【问题描述】:

我最近在 c 中遇到了 '~' 运算符。根据我收集的信息,它只是翻转给定数字的所有位,从而改变它的值。所以我玩弄它并写了这段代码:

第一个程序

#include <stdio.h>

int main(int argc, char *argv[]){
    int x = 100;
    printf("%d\n", x);
    x = ~x;
    printf("signed value = %d\nunsigned value = %u\n", x, x);
    return 0;
}

输出:

100
signed value = -101
unsigned value = 4294967195

然后,我尝试用浮点数做同样的事情:

第二个节目

#include <stdio.h>

int main(int argc, char *argv[]){
    float x = 100;
    printf("%f\n", x);
    x = ~x;
    printf("new value = %f\n", x);
    return 0;
}

但我得到一个错误:

tests.c:6:6: error: wrong type argument to bit-complement
  x = ~x;

所以我做了一些研究,发现我们无法在浮点数上使用“~”运算符。 这是真的?如果是,那我的问题是为什么?

【问题讨论】:

  • 但是为什么你要翻转float的所有位?
  • ^&amp;|^ 等位运算符对整数进行运算。当然,可以使它们对浮点数的按位表示进行运算,但是对浮点值的影响很难描述。如果您真的想这样做,可以将其别名为整数,然后应用运算符。
  • 为什么?这是语言的设计选择,没有特别的原因。对float 变量进行按位否定(或任何其他按位运算符)会得到什么结果?它肯定不会像整数那样表现。它几乎没有用处。
  • @WeatherVane 没有特别的原因。正如我所提到的,我对~ 运算符(以及一般的位运算符)还比较陌生。我好奇地问。
  • 好奇心是好的!但它确实需要一个目的;)

标签: c operators bitwise-operators


【解决方案1】:

无趣且不令人满意的答案 - 因为这是指定语言的方式:

6.5.3.3 一元算术运算符

约束

1     一元 +- 运算符的操作数应具有算术类型; ~ 运算符, 整数类型; ! 运算符的,标量类型。

C 2011 Online Draft

强调我的。

但是,为什么语言是这样指定的?为什么它只允许int 运算符用于~ 运算符?

嗯,有几个可能的原因。第一,它不是那么常见的操作(至少在我个人的经验中不是)——没有多少使用浮点值的人对这些值的按位操作非常感兴趣。可能有一些问题域被大量使用,但我在 30 多年的编程中从未见过它。如果有人真的需要这样做,他们只需键入双关或将浮点数映射到整数类型或 unsigned char 数组并在那里进行位操作,然后映射回原始浮点类型。

两个,浮点格式历来变化很大 - 虽然今天每个人似乎都在 IEEE 754 上融合,但早在 70 年代和 80 年代不同的平台都用浮点做自己的事情。

三,请记住 C 编译为本机代码 - 虽然现代 x86 确实具有用于按位操作浮点类型的本机指令,但我很确定 70 年代初的硬件并非如此。生成的代码中可能存在足够的性能损失,不值得付出努力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2017-02-12
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多