본문 바로가기

C_study

[C] 코딩도장 58 : 자료형 변환하기

58.10 심사문제 : 소수점 이하 버리기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    float num1;
    int num2;

    scanf("%f", &num1);

    num2 = (int)num1; // num1은 실수형이므로 정수형으로 형변환하여 num2에 저장한다.
    printf("%d\n", num2);

    return 0;
}

58.11 심사문제 : 포인터 변환하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main()
{
    unsigned long long *numPtr1 = malloc(sizeof(unsigned long long));
    unsigned int *numPtr2;

    scanf("%llx", numPtr1); 

    numPtr2 = (unsigned int *)numPtr1; /* numPtr1 은 부호없는 8바이트 정수형이므로 낮은 자릿수 
    4바이트를 출력하기 위해서는 4바이트 정수형 포인터로 변환해주어야 한다.*/
    printf("0x%x\n", *numPtr2);

    free(numPtr1);

    return 0;
}

58.12 심사문제 : void 포인터 변환하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main()
{
    long double *numPtr1 = malloc(sizeof(long double));
    void *ptr;

    scanf("%Lf", numPtr1);

    ptr = numPtr1; // ptr에 numPtr1의 주소를 넣어준다

    printf("%Lf\n", *(long double *)ptr); /* ptr은 void형이므로 long double형 포인터로 변환하고
	이를 역참조하면 numPtr1의 메모리에 저장된 값이 출력된다*/
    free(numPtr1);

    return 0;
}

58.13 심사문제 : 구조체 포인터 변환하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Stats {
    float health;
    float healthRegen;
    unsigned int mana;
    float manaRegen;
    float range;
    float attackDamage;
    float armor;
    float attackSpeed;
    float magicResist;
    unsigned int movementSpeed;
};
 
int main()
{
    void *ptr = malloc(sizeof(struct Stats));
    struct Stats st;

    scanf("%u %u", &st.mana, &st.movementSpeed);

    memcpy(ptr, &st, sizeof(struct Stats)); // ptr에 st의 멤버 값을 복사해준다
    st.mana = 0;
    st.movementSpeed = 0;

    printf("%u\n", ((struct Stats*)ptr)->mana); // 구조체 포인터로 변환해준 후, 멤버 mana에 접근한다
    printf("%u\n", ((struct Stats*)ptr)->movementSpeed);
    
    free(ptr);

    return 0;
}