endian 문제 질문입니다.

  • 햇반2
    햇반2

    특정 값에 대해서 strtol의 리턴값이
    2147483647로 출력되고 있습니다.
    자료형을 long long으로 변경 하고 테스트해도
    문제가 발생되고 있는데 조언 부탁 드립니다.

    #include <stdio.h>
    #include <memory.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX 11
    int main() {
        int testCase = 0;
        char inputStr[MAX];
        char outStr[MAX];
        char* p;
        int input;
        int cnt = 2;
        long long res = 0;
        int outResCnt = 0;
        int validSize = 0;
        int inputSize = 0;
        char* temp;
        scanf("%d", &testCase);
        for (int i = 0; i < testCase; i++) {
            scanf("%d", &input);
            sprintf(inputStr, "0x%x", input);
            inputSize = strlen(inputStr);
            validSize = (MAX-1) - inputSize;
    
            if (validSize != 0) {
                temp = (char*)malloc(sizeof(char)*inputSize - 1);
                strcpy(temp, &inputStr[2]);
                strcpy(&inputStr[validSize + 2], temp);
                free(temp);
            }
            memset(inputStr, '0', validSize + 2);
            p = &inputStr[8];
            while (cnt < 10)
            {
                outStr[cnt++] = *p;
                outStr[cnt++] = *(p + 1);
                p = p - 2;
            }
            outStr[0] = '0';
            outStr[1] = 'x';
            outStr[10] = '\0';
            res = (long long)strtol(outStr, NULL, 16);
            printf("%lld\n", res);
            memset(inputStr, 0, 11);
            memset(outStr, 0, 11); 
            cnt = 2;
            p = NULL;
        }
    }
    

    9년 전
1개의 댓글이 있습니다.
  • Toivoa
    Toivoa

    strtol 리턴값이 long인데, long 범위를 넘어가면 LONG_MAX(=2147483647 = 2^31-1) 이 리턴됩니다.


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