为什么turbo c环绕有符号整数溢出每次虽然有符号整数溢出未定义?

时间:2016-12-29 13:07:53

标签: c++ c int turbo-c

我已多次签名溢出,但每次都是turbo c环绕。 例如:

#include <stdio.h>

void main() {
  int i = 100000; 
  printf("%d", i);
  getch();
}

输出为-31072,如果完成环绕,则为预期输出。 在二进制100000(dec)中是11000011010100000,最后16位是存储的 是1000011010100000。在两个补语表示中1000011010100000-31072

1 个答案:

答案 0 :(得分:2)

您的示例没有包含任何已签名的溢出,因此没有未定义的行为。

(假设INT_MAX小于100000。)

作业:

@RunWith(PowerMockRunner.class)
@PrepareForTest(tests.class)
public class test {

@Test
public void test() throws Exception {
    File fileMock = Mockito.mock(File.class);
    PowerMockito.whenNew(File.class).withArguments(Mockito.anyString(), Mockito.anyString()).thenReturn(fileMock);
    FolderServiceImpl sut = new FolderServiceImpl sut ();
    Mockito.when(fileMock.exists()).thenReturn(true);
    sut.getStatus("");

// Your verifications..
}
}

执行从long类型(类型为整数常量100000)到int类型的隐式转换。转换结果是实现定义的 1 (或实现定义的陷阱是信号)。

1 (引自:ISO / IEC 9899:201x 6.3.1.3有符号和无符号整数3)
否则,新类型将被签名,并且值无法在其中表示;无论是 结果是实现定义的或引发实现定义的信号。