Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 操作a+(-a)期间溢出_C++_C_Binary_Overflow_Twos Complement - Fatal编程技术网

C++ 操作a+(-a)期间溢出

C++ 操作a+(-a)期间溢出,c++,c,binary,overflow,twos-complement,C++,C,Binary,Overflow,Twos Complement,a等于1 1+-1=0 但是使用4位二进制,使用2的补码 0001+1111=10000~0000 有符号整数溢出不是未定义的行为吗 我们是依靠未定义的行为来获得如此微不足道的结果,还是我遗漏了什么 : 如果左边的两个进位,即这些示例中最左边的一行上的进位都是1s或都是0s,则结果是有效的;如果左两个进位为1 0或0 1,则发生符号溢出 有符号整数溢出未定义,但我看不出这是一个什么问题,因为您要添加两个有符号的数字,结果确实在范围内 对于4位整数类型,溢出将加上7+7,其中结果应该是14,不适合

a等于1

1+-1=0

但是使用4位二进制,使用2的补码

0001+1111=10000~0000

有符号整数溢出不是未定义的行为吗

我们是依靠未定义的行为来获得如此微不足道的结果,还是我遗漏了什么

: 如果左边的两个进位,即这些示例中最左边的一行上的进位都是1s或都是0s,则结果是有效的;如果左两个进位为1 0或0 1,则发生符号溢出

有符号整数溢出未定义,但我看不出这是一个什么问题,因为您要添加两个有符号的数字,结果确实在范围内

对于4位整数类型,溢出将加上7+7,其中结果应该是14,不适合范围-2^3..2^3-1

有符号整数溢出未定义,但我看不出这会是一个什么问题,因为您添加了两个有符号数字,结果确实在范围内


对于4位整数类型,溢出将加上7+7,其中结果应该是14,不适合范围-2^3..2^3-1

这是未定义的行为,但我不确定是否理解您的问题。你是在问为什么它在那个例子中有效吗?因为这些值在范围内,结果在范围内。考虑

-8+-1

4位


1000+1111->10111->0111->7。这里我们不再有正确的答案,这是未定义的行为,但我不确定我是否理解你的问题。你是在问为什么它在那个例子中有效吗?因为这些值在范围内,结果在范围内。考虑

-8+-1

4位


1000+1111->10111->0111->7。这里我们不再有正确的答案了

底层表示可能会在内部使用溢出来获得正确的结果,但这与此无关。只有当操作的结果超出类型的范围时,行为才是未定义的。

底层表示可能在内部使用溢出来获得正确的结果,但这与此无关。只有当操作的结果超出类型的范围时,该行为才是未定义的。

添加带相反符号的有符号数字不会产生溢出。实际上,硬件通常有两个与加法相关的标志位,即溢出位和进位

仅当容器不足以正确表示数字时,才设置溢出位。对于有符号数,硬件在分析每个操作数的符号位和结果的符号后设置该位。如果操作数的符号不同,它将永远不会设置此位。否则,如果操作数的信号相等,它将分析结果的符号。如果与操作数不同,则设置此标志,指示结果溢出


在您的示例中,每个操作数的符号都不同,因此不会出现溢出,但如果要使用大型容器保持操作正确,此操作将生成进位。

使用相反符号添加有符号数字不会产生溢出。实际上,硬件通常有两个与加法相关的标志位,即溢出位和进位

仅当容器不足以正确表示数字时,才设置溢出位。对于有符号数,硬件在分析每个操作数的符号位和结果的符号后设置该位。如果操作数的符号不同,它将永远不会设置此位。否则,如果操作数的信号相等,它将分析结果的符号。如果与操作数不同,则设置此标志,指示结果溢出


在您的示例中,每个操作数的符号都不同,因此没有溢出,但是如果要使用大型容器保持操作正确,此操作将生成进位。

为什么这与8位、16位等不同?如果您将000…01添加到111…11,您将得到000…00。这可能会有所帮助,因为它讨论了进位和溢出:当您将带符号的数字与相反的信号相加时,将永远不会出现溢出,您看到的是进位号传播,以使更大的容器能够正确运行。编辑:来自wikipedia链接哪个链接?当wikipedia谈到左边的两个进位时,它明确指定它们不是示例中最左边一行的进位。再看一下维基百科页面上的111111111 carryWhy,这与8位、16位等有什么不同?如果您将000…01添加到111…11,您将得到000…00。这可能会有所帮助,因为它讨论了进位和溢出:当您将带符号的数字与相反的信号相加时,将永远不会出现溢出,您看到的是进位号传播,以使更大的容器能够正确运行。编辑:来自wikipedia链接哪个链接?当wikipedia谈到左边的两个进位时,它明确指定它们不是示例中最左边一行的进位。请再次查看维基百科页面,查看11111111

carrywe知道结果在范围内,但在机器级别上,将7+7添加为111+111=1110与将4+-3添加为0100+1101=10001~0001无异。@ZxcvMnb:这取决于硬件。有符号值的add是将所有位相加并设置进位标志,还是在不修改进位标志的情况下生成结果,这由硬件定义。此外,4位算术中不能存在未定义的溢出,因为小于int的类型升级为int,且int的宽度至少为16位。对于较小的类型/位字段,只有一个实现定义的从int到目标类型/位字段的转换。@PascalCuoq:为了简单起见,他显然只使用了4位,他的问题可以扩展到任何有限的位数。@PascalCuoq:我在考虑一个假设的体系结构,在这个体系结构中,int可能只有4位,以避免需要拉大的数字。但是,是的,在执行操作之前,整数类型被提升为int。我们知道结果在范围内,但在机器级别上,添加7+7作为111+111=1110与添加4+-3作为0100+1101=10001~0001没有什么不同。@ZxcvMnb:这取决于硬件。有符号值的add是将所有位相加并设置进位标志,还是在不修改进位标志的情况下生成结果,这由硬件定义。此外,4位算术中不能存在未定义的溢出,因为小于int的类型升级为int,且int的宽度至少为16位。对于较小的类型/位字段,只有一个实现定义的从int到目标类型/位字段的转换。@PascalCuoq:为了简单起见,他显然只使用了4位,他的问题可以扩展到任何有限的位数。@PascalCuoq:我在考虑一个假设的体系结构,在这个体系结构中,int可能只有4位,以避免需要拉大的数字。但是,是的,在执行操作之前,整数类型被提升为int。那么你是说未定义的行为取决于我们的结论,如果超出了范围,而不是实际溢出的位吗?@ZxcvMnb从语言的角度来看,1+-1不会溢出,所以它不是未定义的行为。编译器或硬件所做的是100%不相关的。那么你是说未定义的行为取决于我们的结论,如果超出了范围,而不是实际溢出的位吗?@ZxcvMnb从语言的角度来看,1+-1不会溢出,所以它不是未定义的行为。编译器或硬件所做的是100%无关的。我假设你每次写“信号”时都是指“符号”。我假设你每次写“信号”时都是指“符号”。这是未签名的行为?哇……糟糕的打字错误。我累的时候不应该回答问题。谢谢你的眼睛,fixedit是未签名的行为吗?哇…糟糕的打字错误。我累的时候不应该回答问题。谢谢你的眼睛,修好了