programing

호스트된 구현에서 크기(int)가 1이 될 수 있습니까?

linuxpc 2023. 7. 10. 22:08
반응형

호스트된 구현에서 크기(int)가 1이 될 수 있습니까?

C은 특정 제견는 C 이현 특사만의 을 만족시킬 수 입니다.stdio특히 함특수(히))fputc/fgetc) 만약sizeof(int)==1래 부터.int인 의가한값수있합니능어 야 보 다 할 유 을 합unsigned char또는EOF이 (-1). 이추이 맞까니습론?까?

(분명히분히)sizeof(int)다음의 경우 1이 될 수 없습니다.CHAR_BIT 이는 의최필 입인범해 8니다의 입니다.int그래서 우리는 암묵적으로 구현에 대해서만 이야기하고 있습니다.CHAR_BIT>=16를 들어, 구현이 입니다.stdio.)

편집: 답변과 일부 링크 참조를 읽은 후 호스팅된 구현에 적합한 방법에 대한 몇 가지 생각sizeof(int)==1:

먼저, 몇 가지 인용문:

7.19.7.1(2-3):

스트림이 가리키는 입력 스트림에 대한 파일 끝 표시기가 설정되어 있지 않고 다음 문자가 존재하는 경우, fgetc 함수는 해당 문자를 int로 변환된 부호 없는 문자로 가져오고 스트림에 대한 관련 파일 위치 표시기를 진행합니다(정의된 경우).

스트림에 대한 파일 종료 표시기가 설정되어 있거나 스트림이 파일 종료 표시기에 있는 경우 스트림에 대한 파일 종료 표시기가 설정되고 fgetc 함수는 EOF를 반환합니다.그렇지 않으면 fgetc 함수는 스트림이 가리키는 입력 스트림에서 다음 문자를 반환합니다.읽기 오류가 발생하면 스트림에 대한 오류 표시기가 설정되고 fgetc 함수는 EOF를 반환합니다.

7.19.8.1(2):

fread 함수는 스트림이 가리키는 스트림에서 크기로 지정된 최대 nmemb 요소를 ptr로 가리키는 배열로 읽습니다.각 개체에 대해 크기 호출이 fgetc 함수에 수행되고 결과가 읽힌 순서대로 개체 위에 정확히 표시되지 않는 문자 배열에 저장됩니다.스트림의 파일 위치 표시기(정의된 경우)는 성공적으로 읽은 문자 수만큼 전진합니다.

생각:

  • 읽기 »unsigned char를 벗난 값어의 값int단순히 할 수 있었습니다. 미정의 구현에서 구현 정의 동작.이것은 특히 불안한데, 이것은 사용하는 것을 의미하기 때문입니다.fwrite그리고.fread바이너리 구조를 저장하는 것(이로 인해 이식할 수 없는 파일이 생성되지만 단일 구현에서 이식 가능한 작업으로 간주됨)은 작동하는 것처럼 보이지만 자동으로 실패할 수 있습니다. 본질적으로 항상 결과를 낳습니다. 정의되지 않은 행동 저는 구현체에 사용 가능한 파일 시스템이 없을 수도 있다는 것을 인정하지만, 사용하려고 하면 즉시 자동으로 비음 악마를 호출하는 파일 시스템이 구현체에 있을 수 있다는 것을 인정하기가 훨씬 어렵습니다. 이제 동작이 구현 정의되어 있고 정의되어 있지 않다는 것을 알았기 때문에, 그렇게 불안하지는 않습니다. 저는 이것이 (바람직하지는 않지만) 유효한 구현일 수 있다고 생각합니다.

  • »sizeof(int)==1파일 시스템을 단순히 비어 있고 읽기 전용으로 정의할 수 있습니다.그러면 응용 프로그램이 입력 장치에서만 자체적으로 작성된 데이터를 읽을 수 있는 방법이 없습니다.stdin인 평가만 줄 수 있도록 구현될 수 있습니다.char에 값int.

편집(다시):C99 이론적 근거, 7.4:

EOF는 전통적으로 -1이지만 음수 정수일 수 있으므로 유효한 문자 코드와 구별할 수 있습니다.

이것은 다음을 나타내는 것으로 보입니다.sizeof(int)1이 아닐 수도 있고, 적어도 위원회의 의도일 수도 있습니다.

구현이 다음에 대한 인터페이스 요구사항을 충족할 수 있습니다.fgetc그리고.fputc라 할지라도sizeof(int) == 1.

의 .fgetc문자를 반환한다고 합니다.unsigned char로변된으로 되었습니다.int이 값이 다음 값일 수 없다고 표시된 곳은 없습니다.EOF유효한 판독치가 "보통" 양의 값을 반환할 것이라는 기대가 분명하지만,물론이야.fgetc아온다를 합니다.EOF파일 오류 표시기 또는 파일 종료 표시기(각각)도 설정됩니다.

마찬가지로, 어디에도 당신이 통과할 수 없다고 쓰여 있지 않습니다.EOFfputc 것연 우일 한.unsigned char로변된으로 되었습니다.int.

분명히 프로그래머는 그러한 플랫폼에서 매우 조심해야 합니다.전체 복사를 수행하지 못할 수 있습니다.

void Copy(FILE *out, FILE *in)
{
    int c;
    while((c = fgetc(in)) != EOF)
        fputc(c, out);
}

대신 다음과 같은 작업을 수행해야 합니다(테스트되지 않음!).

void Copy(FILE *out, FILE *in)
{
    int c;
    while((c = fgetc(in)) != EOF || (!feof(in) && !ferror(in)))
        fputc(c, out);
}

물론 실제 문제가 발생하는 플랫폼은sizeof(int) == 1그리고로부터의 전환.unsigned charint주사가 아닙니다.부호와 크기를 사용하거나 부호 정수를 표현하기 위해 1을 보완하는 플랫폼에서는 이것이 반드시 해당될 것이라고 생각합니다.

저는 약 10년 또는 15년 전에 comp.lang.c에서 정확히 같은 질문을 했던 것을 기억합니다.검색해보니, 여기서 더 최근에 논의된 내용이 있습니다.

http://groups.google.de/group/comp.lang.c/browse_thread/thread/9047fe9cc86e1c6a/cb362cbc90e017ac

저는 두 가지 결과가 있다고 생각합니다.

엄격한 준수가 불가능한 구현이 있을 수 있습니다.예를 들어, int 유형의 1차원 또는 부호 크기 음수 값 또는 패딩 비트가 있는 (int)==1 크기입니다. 즉, 부호 없는 모든 char 값을 유효한 int 값으로 변환할 수는 없습니다.

인 관용구((c=fgetc(in))!=EOF)EOF가 별도의 값일 필요가 없기 때문에 (CHAR_BIT==8 제외) 이동할 수 없습니다.

저는 C 표준이 직접적으로 EOF가 스트림에서 읽을 수 있는 어떤 값과도 구별되어야 한다고 생각하지 않습니다.동시에, 그렇게 될 것을 당연하게 생각하는 것처럼 보입니다.표준의 일부 부분에는 EOF가 스트림에서 읽을 수 있는 값이면 충족될 수 있을지 의심되는 상반된 요구 사항이 있습니다.

예를 들어, 다음과 같이 생각합니다.ungetc 규격은 ( "편은", "격§규" (제7.19.7.11항): "§한§" (제7.19.7.11항)로 되어 .

ungetc 함수는 c(부호가 없는 문자로 변환됨)로 지정된 문자를 스트림이 가리키는 입력 스트림으로 다시 푸시합니다.푸시백 문자는 푸시백의 역순으로 해당 스트림의 후속 읽기에 의해 반환됩니다. [ ... ] 푸시백 문자는 한 개만 보장됩니다.

다른 한편으로는 다음과 같은 내용도 있습니다.

c의 값이 매크로 EOF의 값과 같으면 작업이 실패하고 입력 스트림이 변경되지 않습니다.

수 있는) 에서 읽을 수 있는 값이면 ungetcEOF를 다시 스트림에 투입하기 위해서는 문제가 발생합니다. 즉, 통화가 성공하기 위해 "보장"되지만 실패해야 한다는 점입니다.

누군가가 이러한 요구 사항을 조정할 방법을 찾지 못하는 한, 저는 그러한 구현이 적합할 수 있는지에 대해 상당한 의구심을 가지고 있습니다.

관심을 갖는 사람이 있을 경우 N1548(새로운 C 표준의 현재 초안)에서도 동일한 요구사항을 유지합니다.

으로는 충분하지 않을까요?char은 공한유패을과 비트 한.EOF비감각적으로 정의되었습니까?예를 들어, CHAR_BIT가 16이지만 허용된 모든 값이 15개의 최하위 비트만 차지하는 경우(부호 크기 int 표현의 2s 보완 가정).▁athing▁in▁everyable▁represent▁or▁must로 표현할 수 있는 모든 것이 필요합니다.char그런 의미가 있습니까?저는 모른다고 고백합니다.

물론, 이상한 짐승이겠지만, 우리는 우리의 상상력을 여기에 두는 거죠, 그렇죠?

수 걸 이 일이 지속되지 않을 거라는 확신을 심어줬어요.은 반드시 호팅된구구하야때기다문니입어를 구현해야 입니다.stdio.h그리고 만약에fwrite디스크에 정수를 붙일 수 있는 것, 그러면.fgetc모든 비트 패턴을 반환할 수 있습니다.char그리고 그것이 EOF.QED의 반환을 방해해서는 안 됩니다.

당신 말이 옳은 것 같군요.이러한 구현은 사용 시 서명되지 않은 정당한 문자 값과 EOF를 구별할 수 없습니다.fgetc/fputc바이너리 스트림에서.

이러한 구현이 있는 경우( 스레드는 이러한 구현이 있음을 시사함) 엄격하게 준수하지 않습니다.를 사용하여 독립적으로 구현할 수 있습니다.sizeof (int) == 1.

독립 실행형 구현(C994)은 <float> 헤더에 지정된 표준 라이브러리의 기능만 지원하면 됩니다., <iso646.h>, <cisco., <stdarg.h>, <stdbool., <stddef., 및 <stdint.h>. (참고: no <stdio.). DSP나 다른 임베디드 장치에는 독립형이 더 적합할 수 있습니다.

저는 C99에 대해 잘 모르지만, 저는 어떤 것도 보지 못합니다.fgetc의 모든 범위의 값을 생성해야 합니다.char그러한 시스템에서 stdio를 구현하는 분명한 방법은 각각 8비트를 넣는 것입니다.char그 능력에 관계없이의 요건EOF이라

EOF

이는 유형 int 및 음수 값을 가진 정수 상수 식으로 확장되며, 파일의 끝을 나타내는 여러 함수에 의해 반환됩니다. 즉, 스트림에서 더 이상 입력이 없음을 나타냅니다.

상황은 다음과 유사합니다.wchar_t그리고.wint_t7.24.1/2-3에서 정의wint_t그리고.WEOF각주 278은 말합니다.

wchar_t그리고.wint_t동일한 정수 유형일 수 있습니다.

그것은 "소프트" 범위 검사가 그것을 보장하기에 충분하다고 보장하는 것처럼 보일 것입니다.*EOF문자 집합에 없습니다.

편집:

이 경우 바이너리 스트림을 허용할 수 없습니다.fputc그리고.fgetc변환을 수행할 필요가 없습니다. (7.19.2/3) 이진 스트림은 선택 사항이 아니며 텍스트 스트림과의 구별만 선택 사항입니다.따라서 이러한 구현은 규정을 준수하지 않는 것으로 나타납니다.그러나 8비트 범위를 벗어나 이진 데이터를 작성하지 않는 한 여전히 완벽하게 사용할 수 있습니다.

EOF가 문자 집합에서 실제 문자가 될 수 없다고 가정합니다.이 값을 허용하면 (int) == 1의 크기가 정상입니다.

제가 사용하고 있는 TIC55x 컴파일러는 16비트 char와 16bit int를 가지고 있으며 표준 라이브러리를 포함하고 있습니다.라이브러리는 단지 8비트 문자 집합을 가정하기 때문에 문자를 값이 255보다 큰 문자로 해석할 때 정의되지 않으며 8비트 스트림 장치에 쓸 때 가장 중요한 8비트는 폐기됩니다.예를 들어 UART에 쓸 때 하위 8비트만 시프트 레지스터 및 출력으로 전송됩니다.

언급URL : https://stackoverflow.com/questions/3860943/can-sizeofint-ever-be-1-on-a-hosted-implementation

반응형