为啥有符号负数转换为无符号数?
Posted
技术标签:
【中文标题】为啥有符号负数转换为无符号数?【英文标题】:Why are signed negative numbers converted to unsigned numbers?为什么有符号负数转换为无符号数? 【发布时间】:2014-02-16 05:14:35 【问题描述】:特别是我有一个大的无符号数和一个大的有符号负数。
Why can't I divide a large number by a negative number C++
当我尝试将两者相除时,我得到的结果为零仅仅是因为某处将我的有符号数转换为无符号数(意味着它必须是正数)。 >.>;
编辑。
只是为了绝对清楚。我知道它已解决为零,对此我很满意。我也很高兴之前的原因是它被解析为零,因为一个数字从有符号数字转换为无符号数字。
但是,这并不能解释为什么首先将数字从有符号数字转换为无符号数字。这样做似乎没有任何合乎逻辑的理由。
【问题讨论】:
这不是同一个问题吗?您的其他问题没有得到足够好的答案吗? 这不是同一个问题。我之前的问题是关于为什么数字为零。它没有,也没有一个答案回答了他们为什么被转换的问题,只是他们被转换了。 很好:它们被转换是因为标准要求它。 它已被转换,因为它与一个部门中相同类型的unsigned
版本一起使用。它只是通常算术转换的一部分: 否则,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则具有带符号整数类型的操作数应转换为无符号整数类型的操作数的类型。
@chris aka 手册是这么说的。没有给出理由,但就是这样。嗯。谢谢
【参考方案1】:
算术运算符的操作数需要具有相同的类型。这使得该语言更易于定义和实现,部分原因是要处理的案例更少,部分原因是硬件通常也不支持混合类型的操作。形式上,C++ 是根据虚拟机定义的,但该机器的预期功能受到现实世界硬件的影响。标准规定但硬件不支持的操作(例如您假设的有符号-无符号除法)需要由编译器编写者在库代码中实现,这会影响性能。
有符号的操作数需要转换为无符号的,反之亦然。标准委员会选择了前者。
【讨论】:
以上是关于为啥有符号负数转换为无符号数?的主要内容,如果未能解决你的问题,请参考以下文章