![](/img/trans.png)
[英]Why we can't use operator % for float and double type operands?
[英]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 類型; 的!
運算符,標量類型。
強調我的。
但是,為什么要這樣指定語言? 為什么它只允許int
運算符用於~
運算符?
好吧,有幾個可能的原因。 第一,它並不是那么常見的操作(至少在我個人的經驗中不是這樣) - 沒有多少使用浮點值的人對這些值的按位操作非常感興趣。 可能有一些問題域被大量使用,但我在 30 多年的編程中從未見過它。 如果有人真的需要這樣做,他們只需將浮點數鍵入或 map 到整數類型或unsigned char
數組並在那里進行位操作,然后 map 回到原始浮點類型。
第二,浮點格式在歷史上變化很大——雖然今天每個人似乎都在 IEEE 754 上收斂,但早在 70 年代和 80 年代,不同的平台都對浮點做了自己的事情。
三,請記住 C 編譯為本機代碼 - 而現代 x86 確實具有用於按位操作浮點類型的本機指令,我很確定 70 年代初的硬件並非如此。 生成的代碼中可能存在足夠的性能損失,不值得付出努力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.