ENDIANS 질문 드립니다..

  • M
    M

    ENDIANS

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(){
        int n;
        unsigned int num, i;
        char r;
        char test[9] = "";
        scanf("%d", &n);
        while(n--){
            scanf("%d", &num);
            for(i=0;i<8;i++){   //16진수로 만들어 배열에 저장하는 for문
                if((num%16)==15)    test[7-i] = 'f';
                else if((num%16)==14)   test[7-i] = 'e';
                else if((num%16)==13)   test[7-i] = 'd';
                else if((num%16)==12)   test[7-i] = 'c';
                else if((num%16)==11)   test[7-i] = 'b';
                else if((num%16)==10)   test[7-i] = 'a';
                else{   
                    r = num%16;
                    test[7-i] = r+48; //ASCII 코드를 사용해서 더해주는값                
                                    // 48을 더해줘야 제대로 출력됨
                }
                num = num/16;
            }
    
            char endian[10] = {test[6], test[7], test[4], test[5],
                                test[2], test[3], test[0], test[1]};
            //endian을 바꿔줌
            unsigned int t = strtol(endian,NULL,16);
            printf("%u\n", t);
            //바꾼 endian을 10진수로 다시 출력
        }
    }
    

    일단 예시는 입출력이 제대로 됩니다.

    예시말고 다른숫자를 입력했을 때 제대로 출력이 안된다는거겠지요..?
    물론 제가 코딩을 잘못해서 그런거겠지만
    어디가 어떻게 잘못된건지 감도 잘 안잡히는터라...;

    제가 우분투 64비트를 쓰고 있는데 그거 때문에 char나 int 타입의 바이트가 2배가 되버려서
    그런건지.. 그래서 타입을 이것저것 바꿔봤지만 그거때문은 아닌거 같아서요

    어떤 문제가 있는지 잘 감이 안잡히기에 이렇게 애매한 질문은 안되는 거 알지만
    질문해봅니다 도와주세요 ㅠ...


    10년 전
4개의 댓글이 있습니다.
  • kriii
    kriii

    strtol함수의 리턴형이 long이라 생기는 문제로 보입니다.


    10년 전 link
  • kriii
    kriii

    아래처럼 하면 정답이 잘 나옵니다.

    char endian[12] = {'0','x',test[6], test[7], test[4], test[5],test[2], test[3], test[0], test[1], 0};
    
    unsigned int t;
    sscanf (endian,"%x",&t);
    printf("%u\n", t);
    


    10년 전 link
  • Being
    Being

    일부 x64 환경에서는 long이 64비트 부호 있는 정수(signed integer)였겠으나, 채점 환경이 x86 기반인데다가 표준에서조차 그 크기를 강제하고 있지 않은 관계로 32비트 부호 있는 정수로 처리되어 생긴 문제입니다.


    10년 전 link
  • M
    M

    감사합니다 이렇게 해야하는군요...

    어렵네요 ㅠ...

    잘 기억해두겠습니다.


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.