이 기능을 사용할 수있는 숫자는 무엇입니까?


10

어떤 C 컴파일러에서 x와 y의 어떤 값이 충돌을 일으킬까요?

int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}

C의 삼항 연산자 바로 가기이므로 아무도 말하지 않을 것입니다. 이 질문은 프로그램 퍼즐과 코드 골프에 중점을 둔이 사이트의 형식에 맞지 않는 것 같습니다. codegolf.stackexchange.com/faq에 대한 자세한 내용은 FAQ를 참조 하십시오 .
Steven Rumbalski

이것은 코드 골프가 아니지만 퍼즐입니다. 답이 있습니다. 단지 몇 개의 숫자 일뿐입니다.
우고 렌

나는 정정되었다.
Steven Rumbalski

2
실제로 K & R 책에 따르면이 기능은 절대로 충돌하지 않아야합니다. 그러나 ANSI C 표준에 따르면 특정 충돌 사례의 동작은 정의되어 있지 않으며 x86 컴파일러에서는 작동이 중단됩니다.
우고 렌

1
@ dmckee, 당신이 정답을 제공하면, 당신은 승자입니다. 어떤 cretirion이 더 명확하고 객관적 일 수 있습니까? 답은 하나뿐입니다 (또는 다른 예가 있습니까?)
ugoren

답변:


7

-2147483648 (INT_MIN) 및 -1

#include <stdio.h>
#include <limits.h>
int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}
int main() {
    int r = f(INT_MIN, -1);
    printf("%d\n", r);
    return 0;
}

$ gcc -Wall division.c && ./a.out # => zsh : 부동 소수점 예외 ./a.out


과연. 2147483648은 유효한 정수가 아니기 때문에 경고가 표시되어야합니다.
우고 렌

1
그렇습니다. 유효한 int를 사용하기 위해 INT_MIN을 사용한 이유입니다. INT_MAX가 32 비트 int에서 2 ^ 31-1이므로 2147483648은 유효한 int가 아닌 것 같습니다.
eregon

아 2의 보수. 나는 그것을 놓쳤다.
Steven Rumbalski

예, INT_MIN (-2147483648)으로 깨끗하게 컴파일해야합니다.
우고 렌

3

정답은 이미 제공되었지만 즉시 Microsoft Pex 에 대해 생각했습니다 .

Pex는 높은 코드 적용 범위를 가진 테스트 스위트를 자동으로 생성합니다. Visual Studio 코드 편집기에서 Pex는 메서드의 흥미로운 입력 / 출력 값을 찾아서 높은 코드 적용 범위를 가진 작은 테스트 스위트로 저장할 수 있습니다. Microsoft Pex는 .NET Framework 응용 프로그램 테스트를위한 Visual Studio 추가 기능입니다.

퍼즐을 추가 샌드 박스 사이트에서, 그것은 몇 초에서 답, eregons 응답과 동일한를 찾습니다. (요청 pex 클릭)

참고 : C #에서는 그렇게하지만 언어는 실제로 관련이 없습니다.

  • x : int.MinValue
  • y : -1
  • 예외 : OverflowException
  • 메시지 : 산술 연산으로 인해 오버플로가 발생했습니다.

1
좋은. 몇 초 안에 끝나지 않기 때문에 무차별 강제하지는 않습니다. MS의 누군가가 0과 MAX_INT 주위의 숫자가 항상 흥미 롭다는 것을 깨달았습니다.
ugoren

잘하면 그것은 그것보다 조금 더 영리합니다. 그것은 볼 수 (x/y)와 알고 INT_MIN, -1, 0등 그 표현에 대한 모든 문제의 경우는, 평가시 그 값을 생성하는 방법을 리버스 엔지니어링하려고합니다.
Clueless
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.