이 프로그램은 어떻게 작동합니까?
#include <stdio.h>
int main() {
float a = 1234.5f;
printf("%d\n", a);
return 0;
}
다음과 같이 표시됩니다.0
떻게게 그럴? ???그유유 엇엇? ???
나는 고의로 그것을 넣었다.%d
printf
의 printf
.
그 이유는%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
함수에 '바리아드 함수float
double
은 럼,, 신신신프 . . . . . . . . . . . . . . . . . . . . .라고 선언한 a
로 double
.
의 double
SO에 관한 최근 질문에 대한 답변은 다음과 같습니다.
그렇게 합시다.
#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
의의 printf
discl.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
'programing' 카테고리의 다른 글
'아토이'라는 이름은 어디서 유래한 것일까? (0) | 2022.08.10 |
---|---|
VueJs 확장 Tiptap Vuetify 사용 시 편집기 콘텐츠에 스타일 및 클래스 유지 (0) | 2022.08.10 |
Symfony 3.3에서 프런트 엔드 스택을 처리하는 방법 (0) | 2022.08.10 |
vue 템플릿에서 구분되지 않는 공간이 일반 공간으로 렌더링됩니다. (0) | 2022.08.10 |
왜 C 컴파일러는 같은 변수에 대한 두 개의 포인터가 불법/UB일 것이라고 가정하고 const pointer의 값을 변경하는 것을 최적화할 수 없는가? (0) | 2022.08.10 |