programing

이 프로그램은 어떻게 작동합니까?

copyandpastes 2022. 8. 10. 23:31
반응형

이 프로그램은 어떻게 작동합니까?

#include <stdio.h>

int main() {
    float a = 1234.5f;
    printf("%d\n", a);
    return 0;
}

다음과 같이 표시됩니다.0떻게게 그럴? ???그유유 엇엇? ???


나는 고의로 그것을 넣었다.%d printfprintf.

그 이유는%d대 an an an를 int하지만 수레를 제공했잖아요

%e/%f/%g플로트를 인쇄합니다.


: 0이 인쇄되는 : 가 "0"으로 변환됩니다.double printf little endian 5분

00 00 00 00  00 4A 93 40

A %d 32 트 0 이 0 이 as as as as 。 (으로서는 (시험으로) 할 수 있습니다.printf("%d, %d\n", 1234.5f);할 수 .0, 1083394560


?인가?float is is is is is로 됩니다.double은 printf입니다.int printf(const char*, ...).5.2/7 인치

함수 프로토타입 선언자의 줄임표기법에 의해 마지막으로 선언된 파라미터 뒤에 인수유형 변환이 정지됩니다.디폴트 인수 프로모션은 후행 인수에 대해 실행됩니다.

6.5.2/6부터는

착신된 함수를 나타내는 식에 프로토타입을 포함하지 않는 타입이 있는 경우 각 인수에 대해 정수 프로모션이 실행되고 타입을 가진 인수는 승격됩니다.이를 기본 인수 프로모션이라고 합니다.

(알록이 알아줘서 고마워)

2진수로 플로트를 표시하기 때문입니다.정수로 변환하면 0인 채로 남습니다.

엄밀히 말하면, printf하기 위한 즉 공부하기 방법, 즉 공부하기 위한 방법, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관, 도서관 등이 .printf님이 하고 있는 행동에는 큰 도움이 되지 않습니다.''의 을 하려고 할 요.printf시스템에해 주십시오.printf사용할 수 있는지 확인합니다.

를 들어에서는, 「Macbook」이라고 이 표시됩니다.1606416304신신의당

해도, 렇田 a에 하면, 신田고에 합격합니다.float 함수에 '바리아드 함수floatdouble은 럼,, 신신신프 . . . . . . . . . . . . . . . . . . . . .라고 선언한 adouble.

doubleSO에 관한 최근 질문에 대한 답변은 다음과 같습니다.

그렇게 합시다.

#include <stdio.h>

int main(void)
{
    double a = 1234.5f;
    unsigned char *p = (unsigned char *)&a;
    size_t i;

    printf("size of double: %zu, int: %zu\n", sizeof(double), sizeof(int));
    for (i=0; i < sizeof a; ++i)
        printf("%02x ", p[i]);
    putchar('\n');
    return 0;
}

위의 프로그램을 실행하면 다음과 같은 메시지가 나타납니다.

size of double: 8, int: 4
00 00 00 00 00 4a 93 40 

''의 첫 는 '''4'''입니다.double이 , 「0」, 「0」이 되는 일 가능성이 .0의의 printfdiscl.discl.discl을 클릭합니다.

보다 흥미로운 결과를 얻기 위해 프로그램을 약간 변경할 수 있습니다.

#include <stdio.h>

int main(void)
{
    double a = 1234.5f;
    int b = 42;

    printf("%d %d\n", a, b);
    return 0;
}

Macbook에서 위의 프로그램을 실행하면 다음과 같은 메시지가 나타납니다.

42 1606416384

Linux 머신에서 같은 프로그램을 사용하면 다음과 같은 결과를 얻을 수 있습니다.

0 1083394560

%d지정자는 다음과 같이 말합니다.printf정수를 요구합니다.따라서 플로트의 처음 4바이트(플랫폼에 따라서는 2바이트)는 정수로 입력됩니다.0일 경우 0이 인쇄됩니다.

1234.5의 2진수 표현은 다음과 같습니다.

1.00110100101 * 2^10 (exponent is decimal ...)

C 컴파일러를 사용하여float실제로는 IEEE754의 더블값으로서 바이트는 다음과 같습니다(틀리지 않았다면).

01000000 10010011 01001010 00000000 00000000 00000000 00000000 00000000

엔디안이 거의 없는 인텔(x86) 시스템에서는 이 바이트 시퀀스가 반전되어 첫 번째 4바이트가 0이 됩니다.즉, 무엇을printf인쇄하다

IEEE754에 따른 부동소수점 표현에 대해서는 이 Wikipedia 문서를 참조하십시오.

정의되지 않은 동작을 호출했기 때문에 파라미터 유형에 대해 printf() 메서드의 계약을 위반했기 때문에 컴파일러는 자유롭게 할 수 있습니다.그러면 프로그램 출력이 "dksjalk is ninnyhead!!!"가 될 수 있습니다.그리고 엄밀히 따지면 여전히 옳을 것이다.

그 이유는printf()꽤 멍청한 기능입니다.타입을 전혀 체크하지 않습니다.첫 번째 인수가 '아저씨'라고 하면int(이것이 당신이 말하는 것입니다)%d) 。이것에 필요한 바이트는,int의 머신이 4바이트의 바이트를 하고 있다고 가정하면, 의 4바이트는 4바이트입니다.int 8바이트 '8'double(the)float is is is is is is로 됩니다.double에 inside inside inside printf()의 첫 입니다.a「0」은 「0」, 「0」은 「0」입니다.

자동으로 정수로 변환되지 않습니다.둘 다 저장 형식이 다르기 때문입니다.변환하려면 (int) 타이프캐스팅을 사용합니다.

#include <stdio.h>

int main() {
    float a = 1234.5f;
    printf("%d\n", (int)a);
    return 0;
}

또한 C++로 태그를 붙였기 때문에 이 코드는 예상대로 변환을 수행합니다.

#include <iostream.h>

int main() {
    float a = 1234.5f;
    std::cout << a << " " << (int)a << "\n";
    return 0;
}

출력:

1234.5 1234

%d decimal10 수수

%f float(플로트)

여기서 더 많이 봐주세요.

플로트와 정수가 다르게 표현되기 때문에 0이 됩니다.

적절한 형식 지정자(%d,%f,%s 등)를 관련 데이터 유형(int,float,string 등)과 함께 사용하면 됩니다.

%d가 아닌 %f를 원합니다.

뭔가 인쇄를 해야 해서 0이 나왔어요C 0은 다른 모든 것입니다!

정수가 아니에요.도 한번 써보세요.%f.

언급URL : https://stackoverflow.com/questions/2377733/how-does-this-program-work

반응형