Windows 10 콘솔에서 무한대가 "8"로 인쇄되는 이유는 무엇입니까?


146

나는 제로, 즉 포함한 부문에서 반환 무엇을 테스트하고 0/1, 1/0하고 0/0. 이를 위해 다음과 비슷한 것을 사용했습니다.

Console.WriteLine(1d / 0d);

그러나이 코드는와 같은 문자열 상수를 인쇄 8하지 않습니다 .InfinityPositiveInfinity

완성을 위해 다음과 같은 모든 인쇄가 이루어집니다 8.

Console.WriteLine(1d / 0d);

double value = 1d / 0d;
Console.WriteLine(value);

Console.WriteLine(Double.PositiveInfinity);

그리고 Console.WriteLine(Double.NegativeInfinity);인쇄합니다 -8.

이 무한대가 왜 8을 인쇄합니까?


이것이 다음 프로그램의 8이 아닌 무한대 기호라고 생각하는 사람들에게는 :

Console.WriteLine(1d / 0d);

double value = 1d / 0d;
Console.WriteLine(value);

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(8);

출력 :

무한대 출력


69
당신은 무한의 표시입니다 참조하십시오 . 단 8 볼 90 개도를 플립
Mohit Shrivastava

23
8무한대에 대한 이상한 유니 코드 문자가 아닌 실제 90도 회전합니까? 로캘에 따라 변경 될 수 있습니다. 나는 dotnetfiddle.net 에서 그것을 시도하고 인쇄합니다 Infinity.
Kroltan

4
@TheLethalCoder Sinatr이 제안한 것을 수행하거나의 출력을 인쇄하십시오 Double.PositiveInfinity.ToString()[0] == '8'. 일부 글꼴에서 다른 문자와 매우 유사한 이국적인 문자가 있습니다. 또한 컴퓨터는 어떤 언어로 구성되어 있습니까?
Kroltan

15
이것은 Windows 10 문제인 것 같습니다. Windows 8.1에서는 무한대 기호가있었습니다. 며칠 전에 Windows 10으로 업그레이드했으며 이제 8도 있습니다 (독일어 로캘).
René Vogt

13
빠른 점검은 어떤 일이 발생하는지 확인하는 것입니다.Console.Write("∞");
Jon Hanna

답변:


110

부동 소수점 값은 +Infinity0으로 부동 소수점 나누기 -Infinity의 분자 가 양수인 경우 , 0으로 부동 소수점 나누기 의 분자가 음수 인 NaN경우와 부동 소수점 나누기의 분자 및 분모가 모두 0 인 경우입니다. 그것은 C #이 사용 하는 IEEE754 부동 소수점 사양 에 있습니다.

귀하의 경우 콘솔 은 무한대 기호 (인쇄 상으로 가로 8-∞로 표시됨)를 세로 8로 변환합니다.


13
@TheLethalCoder 콘솔의 그림이므로 그림이이 답변을 반증하지 않습니다
Rob

9
@ Rob 나는 대답을 잘못 읽었지만 질문을 구합니다. 왜 8로 변환합니까? 그리고 일부 바이올린 / 콘솔이 문자열 리터럴을 인쇄하는 이유
TheLethalCoder

1
이것은 디버거를 사용하는 경우 인 것 같습니다. 무한대 기호 (예 : 가로 8)를 보았습니다. 다른 사람이 사용 Infinity하거나 비슷한 코드를 사용하더라도 콘솔이 8로 변환되는 이유가 있습니까? 문화를 지정하여 소렌
TheLethalCoder

4
이것을 "lemniscate"라고합니다. 유니 코드 값은 다음과 같습니다. ∞
BlueRaja-Danny Pflughoeft

14
이것은 아마도 버즈 라이트 이어가 "여덟 그리고 그 이상으로!" PC에서 Toy Story를 재생할 때 ;)
DeanOC

70

특정 설정 (예 : 문화권, 출력 인코딩 등)이 지정된 경우 .NET은 유니 코드 무한대 문자 ∞ (∞ / & # 8734;)를 출력합니다. Windows 10 콘솔 / 터미널 에뮬레이터는 (특정 설정이 주어지면 아래 스크린 샷 참조)이 유니 코드 문자를 8로 표시합니다.

예를 들어, Windows 10에서 아래 설정 (코드 페이지 참고)을 사용하여 콘솔에 ∞를 붙여 넣기 만하면 8로 표시됩니다.

재현 설정

편집하다

Chris의 의견 덕분에 : 코드 페이지 와 함께 출력 글꼴 이 콘솔의 ∞ => 8 문제를 담당하는 것 같습니다 . 그와 같이 필자가 시도한 모든 트루 타입 글꼴에서 ∞가 올바르게 표시되고 래스터 글꼴이 선택되면 8 만 표시됩니다.

글꼴 설정


1
내 콘솔에 붙여 넣을 때 실제로 "8"대신 측면에 무한대 기호가 표시되지만 "437 (OEM-미국)"을 사용하고 있지만
Derek 朕 會 功夫

3
정답은 특정 설정으로 인해이 디스플레이 문제가 발생할 수 있지만 후반은 올바르지 않습니다. 내 옵션은 현재 위의 옵션과 정확히 동일하게 표시되며 8이 아닌 ∞가 표시됩니다. 글꼴 페이지로 이동하여 사용 가능한 글꼴 목록에서 "래스터 글꼴"을 선택하면 8 만 표시됩니다. Consolas, Courier New 및 기타 업체 모두 잘 표시되는 것 같습니다.
Chris

코드 페이지가 437 일 때 글꼴을 래스터로 설정하면 여전히 심볼이 올바르게 표시되므로 두 가지 요소의 조합입니다. 조건이 모두 충족되는 경우에만 (적어도 나를 위해) 발생하는 것 같습니다.
Moshe Katz

39

8기호는 Windows가 유니 코드를 레거시 문자 인코딩으로 변환 할 때 발생합니다. 레거시 인코딩에는 무한대 기호가 없으므로 기본적으로 해당 기호에 "최적"를 사용합니다 .이 경우 숫자는 8입니다. Microsoft의 "windows-1252"인코딩에 대한 예를 참조하십시오 . 분명히 Windows 10은 여전히 콘솔에서 기본적으로 레거시 문자 인코딩을 사용합니다 ( "코드 페이지" 참조 ).


11
"8"이 의미 상 혼동을 일으키기에 적합한 경우 왜 "8"이 적합하다고 생각합니까? 코드 페이지 437의 다른 문자는 정도 기호 또는 1 분당 기호 (슬래시 아래에 2 개의 o가있는 %)와 같이 더 적합합니다. 둘 다 실제 무한대 표시만큼 좋지는 않지만 혼동을 일으키는 경향이 적습니다.
supercat

"Windows 10은 콘솔에서 기본적으로 여전히 레거시 문자 인코딩을 사용합니다." 아니요, Windows 10 cmd.exe에서 레거시 인코딩이 기본적으로 해제되어 있습니다.
궤도에서 가벼움 경주

이것이 IMHO의 가장 좋은 답변입니다. 실제로 c : \ windows \ system32 \ c_1252.nls 파일의 Windows 10 상자에서 0x2440 위치의 '8'문자를 볼 수도 있습니다 ( 무한대 는 0x221E이며 파일에는 오프셋을 설명하는 헤더가 있습니다) . 모든 코드 페이지 인코딩에는 해당 .nls 파일이 있습니다. 기본적으로 콘솔은 1252 코드 페이지 (Windows 1252)를 사용합니다. : 유지되지 않습니다 이러한 매핑을 참고이 확인 blogs.msdn.microsoft.com/shawnste/2007/09/24/...
사이먼 Mourier

35

참고 : 콘솔에 .ToString()쓸 때 암시 적 메서드 호출 Double.PositiveInfinity이이 동작을 담당합니다.

부름 Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));

문자열 "무한대"결과

반면 Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr"))); "+ 인피니"결과.

편집 : 다른 사람들이 commets에서 지적했듯이 내 결과를 완전히 확인할 수는 없습니다. 다른 컴퓨터에서 이것을 테스트하면 두 통화에 대한 문자 를 얻습니다 .

의견 에 vtortola 덕분 에 모든 문화권 에 대한 결과.


나는 (아마도) 대답을 찾았다.

Console.OutputEncoding = Encoding.Unicode;"ru", "ru-RU"와 같은 여러 문화권에서 발생하는 동작을 다시 사용 하여 출력을 생성 할 수 있습니다 8.


1
밖으로 관심 나는 당신의 예를 시도하고, 인쇄 (8)
TheLethalCoder

1
@ TheLethalCoder 나는 Infinity둘 다 얻는다 . 앱이 실행되는 문화는 무엇입니까? 확인 Thread.CurrentThread.CurrentCulture하고 Thread.CurrentThread.CurrentUICulture.
vtortola

8
@ Søren D. Ptæus tbh 나는 어떤 문화가 8 dotnetfiddle.net/QYhXMu를
vtortola

1
당신은 암시적인 것에 대해 옳습니다 .ToString(). 결국 관련 ToString().PositiveInfinitySymbol를 반환합니다 NumberFormatInfo. 런타임 버전 및 / 또는 Windows 버전 (또는 모든 OS)에 따라 달라집니다. 예전에는, CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol동일한 것 "Infinity",하지만 런타임의 최신 버전 및 운영 체제와는 "∞"대신. 방금이 스레드에서 Hans Passant의 답변에 대한 의견으로 그것에 대해 물었습니다.
Jeppe Stig Nielsen

16

재현 코드 :

using System;
using System.Text;

class Program {
    static void Main(string[] args) {
        var infinity = "\u221e";
        Console.OutputEncoding = Encoding.GetEncoding(1252);
        Console.WriteLine(infinity);
        Console.ReadLine();
    }
}

코드 페이지 1252는 기본 Windows 코드 페이지이기 때문에 영국에서 흔히 발생하는 사고입니다. 서유럽과 아메리카도 마찬가지입니다. 프로그래밍 방식으로 기본 Console.OutputEncoding 속성을 변경해야하는 많은 이유는 많은 텍스트 파일이 1252 년에 인코딩됩니다. 또는 chcp 1252프로그램을 시작하기 전에 (chcp == 코드 페이지 변경) 을 입력하여 명령 줄에서 입력 하십시오.

1252에서 지원 하는 문자 집합 에서 알 수 있듯이 무한대 기호는 사용할 수 없습니다. 따라서 인코딩은 대체물을 제시해야합니다. 이는 ?지원되지 않는 유니 코드 코드 포인트 의 글리프 인 8 비트 인코딩의 Encoding.EncoderFallback 속성 값인 경우가 많습니다 . 그러나 1252 년과 레거시 MS-Dos 850 및 858 코드 페이지의 경우 Microsoft 프로그래머가로 결정했습니다 8. 재밌는 녀석.

글리프 서양 컴퓨터의 콘솔 앱에 대한 일반적인 코드 페이지에서 지원됩니다. 437 은 레거시 IBM 문자 세트와 일치합니다 . 이러한 종류의 인코딩 재해가 발생하면 유니 코드가 발명 된 것입니다. 슬프게도 콘솔 앱을 구하기에는 너무 늦었습니다. 너무 많은 코드가 기본 MS-Dos 코드 페이지에 의존했습니다.

Double.PositiveInfinity가 "∞"로 변환 된 것은 Win10에만 해당됩니다. 이전 Windows 버전에서는 "무한대"였습니다. 이러한 종류의 형식은 일반적으로 제어판> 언어> 날짜, 시간 또는 숫자 형식 변경> 추가 설정 단추를 사용하여 수정할 수 있지만 무한대 기호 선택은 대화 상자에 포함되지 않습니다. 또한 레지스트리 (HKCU \ Control Panel \ International)에 포함되지 않고 큰 감독입니다. 기본 winapi에서 LOCALE_SPOSINFINITY입니다. .NET 프로그램에서는 CultureInfo를 복제하고 NumberFormatInfo.PositiveInfinitySymbol 속성을 변경하여 프로그래밍 방식으로 재정의 할 수 있습니다. 이처럼 :

using System;
using System.Text;
using System.Threading;
using System.Globalization;

class Program {
    static void Main(string[] args) {
        Console.OutputEncoding = Encoding.GetEncoding(1252);
        var ci = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
        ci.NumberFormat.NegativeInfinitySymbol = "-Infinity";
        ci.NumberFormat.PositiveInfinitySymbol = "And beyond";
        Thread.CurrentThread.CurrentCulture = ci;
        Console.WriteLine(1 / 0.0);
        Console.ReadLine();
    }
}

귀하의 코드를 통해 WinXP가 코드 페이지 437을 사용하고 있음을 확인할 수있었습니다. Windows 10에서는 이제 ý대신 대신 인쇄 됩니다 . 또한 래스터가 아닌 글꼴을 사용하면 문제가 발생하지 않습니다.
Mark Hurd

그것은 여부를 결정 .NET 런타임의 버전 또는 Windows (또는 무엇이든 OS), 또는 이들의 조합의 버전이며, CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol제공 "Infinity"또는 "∞"(또는 뭔가 다른)? 위에서 언급 한 내용은 Windows 10에만 해당되며 언젠가 변경되었음을 동의합니다. 그러나 "동일한"버전의 .NET Framework로 Windows 8에서 응용 프로그램을 실행하면 Windows 10과 다른 결과를 얻습니까?
Jeppe Stig Nielsen

이 문제는 Windows로 시작한 다음 .NET에 문제가 있습니다. Win8은 여전히 ​​"무한대"를 선호합니다
Hans Passant

1
확인했습니다! 방금 Windows Server 2012 R2 컴퓨터 (대략 Windows 8.1에 해당)에 로그인했으며 최신 .NET Framework가 있으며 최신 Windows PowerShell도 가지고 있음을 알고 있습니다. PowerShell $PSVersionTable에서 PS 버전이 5.1 인 것으로 밝혀졌습니다. 이 PowerShell은 해당 컴퓨터의 새로운 .NET Framework (CLR) 버전 4. *를 대상으로합니다. 여전히 [cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolWindows PowerShell Infinity에서는 (현재 문화는 en-US) 이 아닌을 제공합니다 . 결론 : .NET 버전이 아닌 Windows 버전이 결정됩니다.
Jeppe Stig Nielsen

0

.Net 4 이상을 실행할 때 콘솔에 무한대에 대한 "8"이 표시되고, 그렇지 않으면 이전 버전에 "무한대"가 표시됩니다.

Console.OutputEncoding 사용 = Encoding.Unicode; .Net 4 이상에서는 무한대가 ∞로 표시되지만 이전 버전에서는 IOException이 발생합니다.

참고 : Windows 10 64 비트에서 Visual Studio 2015 Community Edition을 실행하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.