我知道,这个问题似乎很奇怪.程序员有时想得太多了.请继续往下读.

在C语言中,我经常使用signedunsigned个整数.我喜欢这样一个事实:如果我做了一些事情,比如给一个无符号变量分配一个有符号整数,编译器会警告我.如果我比较有符号整数和无符号整数以及更多的整数,就会收到警告.

我喜欢这些警告.它们帮助我保持代码正确.

我们为什么不能有同样的豪华彩车呢?平方根绝对不会返回负数.在其他地方,负浮动值也没有意义.完美的未签名浮动候选.

顺便说一句,我对从浮动中移除符号位所能获得的额外精度并不感兴趣.我对现在的float人非常满意.我只想偶尔读mark a float as unsigned,得到与整数相同的警告.

我没有发现任何支持无符号浮点数的编程语言.

知道它们为什么不存在吗?


编辑:

我知道x87FPU没有处理无符号浮点的指令.让我们只使用带符号的浮点指令.误用(例如低于零)可以被认为是未定义的行为,就像有符号整数溢出是未定义的一样.

推荐答案

C++之所以不支持无符号浮点,是因为CPU没有等价的机器代码操作可供执行.因此,支持它将是非常低效的.

如果C++支持它,那么有时你会使用一个未签名的浮点,而不知道你的性能刚刚被杀死.如果C++支持它,那么每个浮点运算都需要判断,看看它是否被签署.对于执行数百万浮点运算的程序来说,这是不可接受的.

所以问题是为什么硬件实现者不支持它.我认为答案是,最初没有定义无符号浮动标准.因为语言喜欢向后兼容,即使添加了它,语言也无法利用它.要查看浮点规格,您应该查看IEEE standard 754 Floating-Point.

不过,您可以通过创建一个无符号浮点类来避免使用无符号浮点类型,该类封装了一个float或double,并在try 传入负数时发出警告.这是效率较低的,但如果你不频繁地使用它们,你可能不会在意轻微的性能损失.

我肯定看到了无符号浮点的用处.但C/C++倾向于 Select 最适合每个人的效率,而不是安全性.

C++相关问答推荐

int_leastX_t与intX_t不同吗?

va_arg -Linux和Windows上的不同行为

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

在#include中使用C宏变量

正在try 将文件/文件夹名从目录 struct 存储到链接列表

无法用C++编译我的单元测试

C++中矢量类型定义和数据保护的高效解决方案

如何按顺序将所有CSV文件数据读入 struct 数组?

无法访问共享目标文件内的共享指针

这段代码用于在C中以相反的顺序打印数组,但它不起作用

链表删除 node 错误

在C程序中使用Beaglebone Black UART的问题

从另一个宏函数调用C宏

将char*数组深度复制到 struct 中?

Ubuntu编译:C中的文件格式无法识别错误

模仿 memmove 的行为

将指针的地址加载到寄存器内联拇指组件中

一元运算符

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同