簡體   English   中英

為什么我們不能在浮點數上使用 '~' 運算符

[英]Why can't we use the '~' operator on a float

我最近在 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;
}

使用 output:

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;

所以我做了一些研究,發現我們無法在浮點數上使用“~”運算符。 這是真的? 如果是,那么我的問題是為什么?

無趣且不令人滿意的答案 - 因為這就是指定語言的方式:

6.5.3.3 一元算術運算符

約束

1 一元+-運算符的操作數應具有算術類型; ~運算符的 integer 類型 ! 運算符,標量類型。

C 2011年在線草案

強調我的。

但是,為什么要這樣指定語言? 為什么它只允許int運算符用於~運算符?

好吧,有幾個可能的原因。 第一,它並不是那么常見的操作(至少在我個人的經驗中不是這樣) - 沒有多少使用浮點值的人對這些值的按位操作非常感興趣。 可能有一些問題域被大量使用,但我在 30 多年的編程中從未見過它。 如果有人真的需要這樣做,他們只需將浮點數鍵入或 map 到整數類型或unsigned char數組並在那里進行位操作,然后 map 回到原始浮點類型。

第二,浮點格式在歷史上變化很大——雖然今天每個人似乎都在 IEEE 754 上收斂,但早在 70 年代和 80 年代,不同的平台都對浮點做了自己的事情。

三,請記住 C 編譯為本機代碼 - 而現代 x86 確實具有用於按位操作浮點類型的本機指令,我很確定 70 年代初的硬件並非如此。 生成的代碼中可能存在足夠的性能損失,不值得付出努力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM