문제

Sprintf를 사용하여 UINT_64를 문자열로 변환하는 C (++) 코드가 있습니다. 이것은 Linux와 Solaris 모두에 휴대 할 수 있어야합니다.

Linux에서는 %ju를 사용하지만 Solaris에는 동등한 것으로 보이지 않습니다. 내가 찾을 수있는 가장 가까운 것은 %lu이지만, 이것은 잘못된 출력을 생성합니다. 일부 샘플 코드 :

#include <stdio.h>
#include <sys/types.h>

#ifdef SunOS
typedef uint64_t u_int64_t;
#endif

int main(int argc, char **argv) {
    u_int64_t val = 123456789123L;

#ifdef SunOS
    printf("%lu\n", val);
#else
    printf("%ju\n", val);
#endif
}

Linux에서는 출력이 예상대로입니다. Solaris 9에서 (묻지 마십시오) "28"입니다.

무엇을 사용할 수 있습니까?

도움이 되었습니까?

해결책

inttypes.h가있는 경우 제공하는 매크로를 사용할 수 있습니다.

printf(  "%" PRIu64 "\n", val);

예쁘지는 않지만 (최근에 많이 말하는 것 같습니다) 작동합니다.

다른 팁

C99 호환 시스템 :

#include <inttypes.h>

uint64_t big = ...;
printf("%" PRIu64 "\n", big);

C99 표준의 섹션 7.8을 참조하십시오.

지정자는 {pri, scn} [diouxx] {n, 최소한, max, fastn, ptr}입니다.

PRI는 printf () 패밀리를위한 것입니다. SCN은 scanf () 패밀리, d 및 i가 서명 된 적분 유형에 대한 것입니다. o, u, x, x는 서명되지 않은 적분 유형에 대한 Octal, Decimal, Hex 및 Hex; N은 지원되는 너비 중 하나입니다. 최소 및 빠른 수정 자에 해당합니다. ptr은 intptr_t를위한 것입니다. Max는 intmax_t입니다.

답은 코드가 실제로 C 또는 C ++인지에 따라 다릅니다. C에서는 An을 사용해야합니다 unsigned long long 다른 유형보다는 (이것은 현재 표준에 부합하고 long long C99 지원이 진행되는 한 매우 일반적입니다), 추가 ULL 대신에 L 당신의 상수와 사용 (언급 된 바와 같이) %llu 지정자로. C99에 대한 지원이 존재하지 않으면 다른 표준 방법이 없으므로 컴파일러 문서를 확인할 수 있습니다. long long 적어도 64 비트로 보증되었습니다.

당신이 사용할 수있는 %llu 오랫동안. 그러나 이것은 매우 휴대 성이 아닙니다. 왜냐하면 long long 64 비트로 보장되지 않습니다. :-)

당신은 얻을 수 있습니다 uint64_t ~에서 stdint.h Sunos 조건부 Typedef를 피하려면.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top