2011-02-27 5 views
10
unsigned short a; 
    char temp[] = "70000"; 
    a = atoi(temp); 
    printf("a: %d\n", a); 

a: 70000해야 할 때 진수 ASCII 변환하는 더 나은 방법이 있나요 나에게 출력 a: 4464를 제공? 부호없는 단락의 범위는 0 - 65535입니다.인쇄 부호 없음 short 값

답변

8

귀하가 직접 질문하고 있습니다. unsigned short의 범위는 0-65535입니다. 따라서 70000은 2 바이트에 들어 가지 않으므로 4 바이트의 데이터 유형을 사용하십시오 (unsigned int이 작동해야합니다. sizeof으로 크기를 확인할 수 있습니다).

+1

글쎄, 내 컴퓨터 과학 숙제를 위해 우리는 unsigned short 데이터 형식을 사용해야한다. – foo

+3

@mateo : 글쎄, 70000을 2 바이트 기간에 맞출 수 없다. 숙제가 당신에게 시도 할 것을 요구하면, 대답은 "나는 너와 교사가 될 수 없다."입니다. 그러나 적절히 말하지 않으므로 다시 읽으십시오. 그러면 우리가 대답하기를 원하면 정확한 문구를 말해주십시오. – delnan

+2

이 경우 70000을 서명되지 않은 두 개의 단락에만 저장할 수 있지만 단 하나에는 저장할 수 없습니다. 참 이상한 소리. – schnaader

8

schnaader said과 같이 오버 플로우 문제가 발생할 수 있습니다.

그러나 부호가없는 값 출력에 대한 printf 질문에 대답하는 경우 u 수정 기호 ("서명되지 않음")가 필요합니다. 옌스 아래 지적이 경우, 당신은 %hu을 원하는 :

printf("a: %hu\n", a); 

을 ... 단지 %u (unsigned int, 오히려 unsigned short보다가) 아마 잘 작동하지만, shortint 때를에 승진 때문에 printf에 대한 스택에 푸시됩니다.

다시 말해서 플랫폼의 unsigned short에 70000 값이 들어가는 경우에만 해당됩니다.

+6

'a'가'unsigned short'이면'% hu'는 올바른 지정자입니다. –

+0

@Jens : 감사. 'h '지정자는 C 표준에서 정의되어 있습니까? (C++이 아니라 특정 컴파일러가 아닙니다.) 녹록한 기억은'printf'와 같은 varargs 상황에서 스택에 푸시 될 때'short' 값이'int'로 변환된다는 것입니다. 편집 : 예를 들어, 예상 출력 ('42, 60000, 42') 얻을 ​​: http://pastie.org/1613793'gcc -Wall'는 내게 어떤 경고도주지 않았다 (GCC 4.4.3). 물론, 그건 어딘가에서 나를 도우려는 것일 수도 있고, 제 아키텍처 나 컴파일러 등에 한정 될 수도 있습니다 :-) –

+1

예, C99입니다. 그리고 네, 인수는'unsigned short'가 맞으면'int'로, 그렇지 않으면'unsigned int'로 승격됩니다. 그러나 이것은 형식적인 지시자로'printf'가'int'를 해석하는 방법을 알려줍니다. –