C++ C+中整数的除法+;没有按预期工作

C++ C+中整数的除法+;没有按预期工作,c++,C++,我是新来的,非常抱歉,如果这是基本的,但我在这里错过了什么?这只是一个伪代码: #include <iostream> using namespace std; int main() { unsigned int a, b, c; int d; a = 10E06; b = 25E06; c = 4096; d = (a - b)/c; std::cout << d << std::endl;

我是新来的,非常抱歉,如果这是基本的,但我在这里错过了什么?这只是一个伪代码:

#include <iostream>
using namespace std;

int main() {
    unsigned int a, b, c;
    int d;
    a = 10E06;
    b = 25E06;
    c = 4096;
    d = (a - b)/c;
    std::cout << d << std::endl;
    return 0;
}
#包括
使用名称空间std;
int main(){
无符号整数a,b,c;
int d;
a=10E06;
b=25E06;
c=4096;
d=(a-b)/c;
std::cout这是因为
(a-b)
本身是无符号的:

#include <iostream>
using namespace std;

int main() {
    unsigned int a, b, c;
    int d;
    a = 10E06;
    b = 25E06;
    c = 4096;
    d = (a - b)/c;
    std::cout << (a-b) << std::endl; // 4279967296
    std::cout << d << std::endl; // 1044913 
    return 0;
}
#包括
使用名称空间std;
int main(){
无符号整数a,b,c;
int d;
a=10E06;
b=25E06;
c=4096;
d=(a-b)/c;

std::cout无符号数之间的运算产生无符号数。由您来确保这些运算有意义,或者防止出现相反的情况


如果有
unsigned int a=2,b=3;
,您认为
a-b
的值是多少?

由于a b和c都声明为无符号,因此计算的输出(a-b)/c将是无符号的。由于您提供的值的计算不能正确地用无符号类型表示,因此事情变得有点混乱。然后将无符号值赋给d,即使这是有符号的,该值也已被篡改


我还将注意到,符号10E06表示一个浮点数,该浮点数随后被隐式转换为无符号整数。根据提供的特定浮点数,这可能会或可能不会按预期进行转换。

您希望结果带有符号。因此,您应该将变量声明为有符号整数或仅为整数。这将导致我得到了理想的结果。如果你将a和b转换为长,a-b将变长,因此需要一个符号。下面是一个解决方案

int main() {
    int a, b, c;
    int d;
    a = 10E06;
    b = 25E06;
    c = 4096;
    d = (a - b)/c;
    std::cout << d << std::endl;
    return 0;
}
intmain(){
INTA、b、c;
int d;
a=10E06;
b=25E06;
c=4096;
d=(a-b)/c;
STD::CUT< P>因为C++(和许多其他基于C语言)处理操作符的方式,当未签名的数字被放入表达式时,表达式返回一个未签名的值,而不被保存在一个可能被预期的神秘的类型间状态。
逐步:

  • (a-b)
    从10E06中减去25E06,通常返回-15E06,它是无符号的,因此它被包装成一堆垃圾
  • 这个垃圾然后除以c,两个输入都是无符号的,所以输出也是无符号的
  • 最后,它被填充到一个带符号的int中,剩余值为1044913

“unsigned int”是一种类似于float和bool的类型,尽管它需要两个关键字。如果要将其转换为用于该计算的有符号int,则必须确保a、b和c都是有符号的(删除unsigned关键字),或者在将它们放入表达式时将其强制转换为有符号的,如下面所示:
d=((有符号的)a-(有符号的)b)/(签名)c、 

您是在警告打开的情况下编译的吗?否?为什么不?这是什么,科学记数法?十六进制数前面通常有
0x
为什么您认为它与除法有关?删除
无符号的
,您将得到预期的结果。@罗伯塔维:是的,这是科学记数法。
10E06
是有效的类型<代码>双;隐式转换为<代码>未签名INT/COD>。在这种特殊情况下,只要<代码>无符号INT/COD>是32位或更宽,就不可能有精度损失。但这是一种错误的实践。(一些语言支持整数文字的指数表示法;C++不支持。)
int main() {
    double a, b, c;
    double d;
    a = 10E06;
    b = 25E06;
    c = 4096;
    d = (a - b)/c;
    std::cout << d << std::endl;
    return 0;
}