programing

무한대 = 0x3f3f3f인 이유는 무엇입니까?

telecom 2023. 11. 6. 21:38
반응형

무한대 = 0x3f3f3f인 이유는 무엇입니까?

어떤 상황에서는 일반적으로 무한대를 나타낼 수 있을 만큼 충분히 큰 정수 값을 사용합니다.저는 보통 가장 큰 양/음의 정수를 사용합니다.오버플로를 방지하려면 사실상 모든 산술 연산을 수행하기 전에 피연산자 중 하나가 무한대인지 확인해야 하기 때문에 일반적으로 더 많은 코드를 얻을 수 있습니다.때때로 포화 정수 연산을 갖는 것이 바람직할 것입니다.이러한 이유로, 어떤 사람들은 넘침 없이 몇 번을 더하거나 곱할 수 있는 무한대에 대한 더 작은 값을 사용합니다.흥미를 끄는 것은 (특히 프로그래밍 대회에서) 매우 흔히 볼 수 있다는 사실입니다.

const int INF = 0x3f3f3f3f;

왜 그 번호가 특별합니까?이항 표현은 다음과 같습니다.

00111111001111110011111100111111

여기 특별한 흥미로운 부동산은 보이지 않습니다.타이핑하기 쉽다는 것을 알고 있지만, 만약 그것이 이유라면 거의 모든 것이 가능할 것입니다(0x3e3e3e, 0x2f2f2f2f 등).오버플로 없이 한 번 추가할 수 있으며 다음과 같은 이점이 있습니다.

a = min(INF, b + c);

하지만 다른 상수들은 모두 가능합니다.구글링은 그 상수를 사용하는 많은 코드 조각만 보여줄 뿐 설명이나 코멘트는 보여주지 않습니다.

누가 알아챌 수 있습니까?

여기서 이에 대한 몇 가지 증거를 발견했습니다(중국어 원본 컨텐츠). 기본 아이디어는 0x7ffff가 이미 4바이트 서명된 int 범위의 "최상위"이기 때문에 문제가 있다는 것입니다. 따라서 여기에 무엇이든 추가하면 음수가 됩니다. 대신 0x3f3f3f:

  • 여전히 꽤 큽니다(크기 0x7ffff의 동일한 순서).
  • 정수의 유효한 범위가 그 아래의 숫자로 제한된다고 하면, 그 위에 "valid 양수"를 추가할 수 있고, 여전히 무한대(즉, 어떤 것).>=INF)까지INF+INF넘치지 않습니다.이를 통해 항상 "통제" 상태를 유지할 수 있습니다.

    a+=b;
    if(a>INF)
        a=INF;
    
  • 동일한 바이트의 반복입니다. 이는 당신이 쉽게memset에 쑤셔넣다INF;

  • 또한 @Jörg W Mitag가 위에서 알아차린 것처럼, 이것은 멋진 ASCII 표현을 가지고 있어서 메모리 덤프를 보면서 즉시 발견하고 메모리에 직접 쓸 수 있습니다.

저는 0x3f3f3f의 최초 발견자 중 한 명일 수도 있고 아닐 수도 있습니다.2004년 루마니아 기사(http://www.infoarena.ro/12-ponturi-pentru-programatorii-cc #9)를 냈지만 2002년부터 이 값을 최소한 프로그래밍 대회에 사용하고 있습니다.

두 가지 이유가 있습니다.

  • 0x3f3f3f3f + 0x3f3f3f가 int32에서 오버플로되지 않습니다.이를 위해 일부는 100000000(10억)을 사용합니다.
  • 하는 것으로 int의 배열을 무한대로 설정할 수 있습니다.memset(array, 0x3f, sizeof(array))

0x3f3f3f3f는 문자열의 ASCII 표현입니다.????.

크루글은 전체 데이터베이스에서 해당 상수의 48개 인스턴스를 찾습니다.이 중 46개의 인스턴스는 자바 프로젝트에서 그래픽 조작을 위한 비트마스크로 사용됩니다.

1 프로젝트는 알 수 없는 ACPI 장치를 나타내는 데 사용되는 운영 체제입니다.

1개의 프로젝트는 자바 그래픽을 위한 비트마스크입니다.

따라서, 크루글이 색인화한 모든 프로젝트에서 비트 패턴 때문에 47번, ASCII 해석 때문에 한 번, 무한을 나타내는 표현으로 단 한 번도 사용되지 않습니다.

언급URL : https://stackoverflow.com/questions/18429021/why-is-infinity-0x3f3f3f3f

반응형