programing

C 프로그램은 동일한 고정 길이 데이터 유형을 사용함에도 불구하고 여러 기계에서 다른 결과를 산출합니다.

newsource 2023. 9. 7. 21:43

C 프로그램은 동일한 고정 길이 데이터 유형을 사용함에도 불구하고 여러 기계에서 다른 결과를 산출합니다.

int타입으로 실험할 때 만든 간단한 프로그램.h:

#include <stdio.h>
#include <stdbool.h>
#include <inttypes.h>

bool get_bit(uint32_t x, uint8_t n) {
    x >>= n;
    return x & 1;
}

int main() {
    uint32_t x;
    uint8_t n;

    printf ("Enter x: ");
    scanf("%"SCNu32, &x);

    printf ("Enter n: ");
    scanf("%"SCNu8, &n);

    printf("The %"PRIu8"th bit of %"PRIu32" is: %d", n, x, get_bit(x, n));
    return 0;
}

내 폰(64비트 옥타코어 ARN LTE Soc Android 10)에서는 잘 작동합니다.

Enter x: 1
Enter n: 0
The 0th bit of 1 is: 1

하지만 제 컴퓨터(64비트 x86 Windows 10)에서는 다음과 같은 메시지가 표시됩니다.

Enter x: 1
Enter n: 0
The 0th bit of 0 is: 0

bool을 uint8_t로 변경해도 영향이 없습니다.

편집: MinGW-w64 GCC C99 및 C17로 컴파일을 시도했습니다.

Microsoft의 비준수 CRT(비) 표준 라이브러리를 사용하는 Windows 컴파일러를 사용하는 경우 이 문제가 발생할 수 있습니다.즉, Visual Studio 또는 Mingw64/gcc입니다.

Mingw/gcc에서 재생할 수 있습니다.마이크로소프트 CRT가 고장 났다는 것은 잘 알려진 문제이며 예를 들어 C99에 도입된 다양한 포맷 사양을 지원하지 않습니다.문제는 다음에 있는 것 같습니다.scanf잘못된 형식 지정자를 사용하여 읽습니다. 모든 경고를 사용하도록 컴파일하면 다음과 같은 메시지가 표시되기 때문입니다.

경고: 알 수 없는 변환 유형 문자 'h' 형식 [-Wformat=]

%hh두건 밑에 있는 존재가 되는 것.SCNu8하지만 컴파일러는 오직 한가지만 읽습니다.%h그리고 거기서 멈춘다.scanf호출이 실제로 실패합니다.

적어도 Mingw에서는 다음을 사용하여 CRT lib의 트랩을 해제할 수 있습니다.

#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>

당신의 코드에 위 내용을 추가했을 때,The 0th bit of 1 is: 1.
위의 패치가 없으면 내가 얻을 수 있습니다.The 0th bit of 0 is: 0

언급URL : https://stackoverflow.com/questions/70593571/c-program-yielding-different-results-on-different-machines-despite-using-the-sam