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
'programing' 카테고리의 다른 글
Moment.js를 사용하여 날짜 형식 지정 및 날짜 빼기 (0) | 2023.09.07 |
---|---|
ODP.NET으로 Oracle 11g에서 보호된 메모리 읽기 또는 쓰기 시도 (0) | 2023.09.07 |
Mysql/Mariadb 스크립트를 debian에서 부팅할 때 어떻게 작동합니까? (0) | 2023.09.07 |
Python 파일로 긴 상수 목록 가져오기 (0) | 2023.09.07 |
Laravel : 데이터베이스에 첫번째 사용자를 삽입하는 방법 (0) | 2023.09.07 |