반응형

출처: http://ko.m.wikibooks.org/wiki/C_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%9E%85%EB%AC%B8/%EC%A0%95%EC%88%98%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0

 

 

C 프로그래밍 입문/정수형 데이터

  • 이 문서 주시

 

정수형 데이터편집

C 에서 가장 많이 다루는 데이터 형태는 정수형이고, 그만큼 데이터 타입도 다양하다. 먼저 C 정수형 데이터의 기본 데이터를 확인해 보도록 하자:

타입 바이트수 최소값/최대값 limits.h 상수 접미사 비고
(signed) short (int)
unsigned short (int)
2 -32768 - 32767
0 - 65535
SHRT_MIN, SHRT_MAX
USHRT_MAX
(signed) int
unsigned (int)
4* -2147483648 - 2147483647
0 - 4294967295
INT_MIN, INT_MAX
UINT_MAX

U
(signed) long (int)
unsigned long (int)
4** -2147483648 - 2147483647
0 - 4294967295
LONG_MIN, LONG_MAX
ULONG_MAX
L
UL
(signed) long long (int)
unsigned long long (int)
8 -9223372036854775808 - 9223372036854775807
0 - 18446744073709551615
LONG_LONG_MIN, LONG_LONG_MAX
ULONG_LONG_MAX
LL
ULL

*, **: 이 크기는 컴파일러에 따라 달라집니다. 이 아래에 자세한 내용을 설명하였습니다.
표의 타입에 괄호가 쳐진 것은 원래 있어야 하는 내용이지만 생략이 가능하고 보통은 생략하여 사용한다는 뜻 입니다. 예를 들어 unsinged int 타입은 그냥 unsinged 로 사용할 수 있습니다.


정수 타입의 데이터는 많은 변화를 거쳐왔기 때문에 약간의 혼동의 여지가 있다. 먼저 int 타입이 있는데, 이 int 타입은 가장 효율적으로 처리될 수 있는 정수타입이라는 의미이다. 문제는 효율적으로 처리라는 문구에서 시작되는데, 이 이야기를 하기 전에 먼저 해야할 이야기가 하나 있다.

위에서 설명했듯이 컴퓨터를 분류하는 방법 중에는 n 비트 컴퓨터 - 8비트 컴퓨터, 16비트 컴퓨터 등등 - 라는 표현이 있고, 이 n 비트 컴퓨터라는 말의 기본적인 정의는 n 비트 단위로 데이터를 처리하는 컴퓨터라는 뜻이다. 다른 표현을 사용 한다면 8비트 컴퓨터는 데이터를 처리할 때 8비트씩 읽어들여서 처리 하고, 16비트 컴퓨터는 16비트씩 읽어서 처리 한다는 뜻이다. 의미 상으로는 16비트 데이터를 처리할 때 8비트 컴퓨터는 두 번 일을 해야 하고, 16비트 컴퓨터는 한 번만 해도 된다는 의미로, 수치적으로는 16비트 컴퓨터의 속도가 8비트 컴퓨터의 두 배 빠른 컴퓨터 라는 의미 이다[1].

다시 int 타입에 대해서 이야기 하자면, int 타입은 '가장 효율적으로 처리될 수 있는 정수 타입'이기 때문에 16비트 컴퓨터에서는 16비트, 그러니까 2바이트일 때 가장 효율적이므로 int 타입의 크기는 2바이트 이다. 그리고 32 비트 컴퓨터 일 땐 32비트 즉, 4 바이트일 때 가장 효율적으로 32비트 컴퓨터에서는 int 타입의 크기는 4 바이트가 된다. 그래서 8 비트 컴퓨터나 16비트 컴퓨터의 int 타입은 short int 와 동일한 데이터 타입이 되고, 32비트 컴퓨터의 int 타입은 long int와 동일한 데이터 타입이 된다.

문제는 64비트 컴퓨터가 대두 되었을 때 발생 하였는데, int 타입을 64비트로 잡아주면 long int가 int 보다 다룰 수 있는 데이터의 크기가 적어지는 모순이 생기게 되었다. 그래서 64비트 컴퓨터에서는 int를 32비트로 쓰고 long int를 64비트를 쓰는 경우와, int와 long int 모두를 32비트 컴퓨터와 동일하게 32비트를 쓰고, long long int 라는 새로운 64비트 타입을 도입한 경우가 있다.

일단 위의 표는 C99에서 제시한 표준에 따라 작성되었으며, 상황에 따라서는 위의 표와 다른 경우가 있을 수 도 있다는 것을 알려두기 위해서 위의 내용을 기술하였다.

정수형 상수는 기본적으로 int 타입으로 간주되며 short 타입을 강제하는 접미사는 없다. unsigned 타입의 상수임을 명기 하기 위해서는 u나 U를 사용하면 된다. 예를 들어 그냥 '1'이라고 상수를 사용하면 signed int 타입이 되지만, '1U'혹은 '1u'라 표기하면 unsigned int 타입의 상수가 되고, '1ul' 혹은 '1UL'이라 표기하면 unsigned long int 타입의 상수로 다루어 진다.

정수형 상수를 표기할때 사용할 수 있는 진법은 8진법, 10진법, 16진법이다. 8진법 상수를 표기 할때는 0을 시작으로 8진 숫자를 사용한다. 예를들어 8진수 72를 표기하기위해서는 '072'라 표기해 주면 된다. 16진법을 표기하기 위해 사용되는 접두어는 0x 혹은 0X이고, 16진 숫자를 쓰면 된다. 예를 들어 16진수 ae4f를 표기하기 위해서는 '0xae4f'라 쓰면 된다. 8진수나 16진수 상수를 사용하는 경우에도 10진수에서 사용하는 타입지정 접미사는 그대로 사용할 수 있다.

고정폭 정수 타입편집

이렇듯 데이터의 크기가 환경에 따라 조금씩 달라지기 때문에, 데이터를 쓸 수 있는 값의 차이가 아닌 데이터가 차지하는 메모리 공간이라는 입장에서 봐야 할 땐 이런 일괄적이지 못한 데이터 타입은 프로그래머의 혼란을 야기할 뿐 아니라, 프로그램 코드가 컴파일되는 환경에 따라 다른 코드를 사용해야 하는 문제가 발생한다. 그래서 새로 제시된 타입이 다음과 같은 것 들이 있다.

타입 바이트수 최소값/최대값 stdint.h 상수 비고
int8_t
uint8_t
1 -128 - 127
0 - 255
INT8_MIN, INT8_MAX
UINT8_MAX
int16_t
uint16_t
2 -32768 - 32767
0 - 65535
INT16_MIN, INT16_MAX
UINT16_MAX
int32_t
uint32_t
4 -2147483648 - 2147483647
0 - 4294967295
INT32_MIN, INT32_MAX
UINT32_MAX
int64_t
uint64_t
8 -9223372036854775808 - 9223372036854775807
0 - 18446744073709551615
INT64_MIN, INT64_MAX
UINT64_MAX

데이터 폭이 정해져 있는 타입들과 관련된 상수는 <limits.h> 파일이 아닌 <stdint.h> 파일에 정의되어 있다. 위에 언급된 타입들 외에도 최소 n 비트 이상의 정수 데이터를 저장할 수 있는 타입을 의미하는 int_leastn_t, uint_leastn_t (이때 n은 8, 16, 32, 64)타입과 n비트 이상의 데이터 타입중 가장 빠른 타입이라는 의미의 int_fastn_t, uint_fastn_t 타입, 현 시스템에서 사용할 수 있는 가장 큰 정수형 데이터 타입을 의미하는 intmax_t와 uintmax_t 타입도 표준에는 정의 되어있다.

위 표에 나열 되어있는 데이터 타입들은 사용되는 메모리의 양이 분명해야 하는 경우에 사용되며 산술연산을 위해서는 거의 사용되지 않는다. 주로 네트워크 패킷을 처리하는 프로그램 코드에서 자주 볼 수 있다.

조금 어려운 이야기 -- 바이트 오더 혹은 엔디언편집

위에서 8비트 컴퓨터는 데이터를 8비트 단위로 처리한다는 이야길 했었다. 그러나 8비트로 표현할 수 있는 정수 값은 0 ~ 255 사이의 256개의 숫자 뿐이다. 그러나 실제 프로그램을 작성할 때에는 255보다 큰 값을 처리 해야 할 상황이 발생하기 마련이다. 그런 경우에 2개의 8비트 데이터를 합쳐서 16비트 데이터로 처리 하거나 4개의 8비트 데이터를 합쳐서 32비트 데이터를 처리 해야만 한다.

2개의 8비트 데이터를 합쳐서 덧셈을 하는 경우에는 먼저 2개의 8비트 데이터를 더한 다음에 자리 올림을 해서 다음번 8비트 데이터를 덧셈 하는 방식을 사용하게 된다. 좀더 간단하게 설명하자면 19 + 27을 계산할 때 먼저 9 + 7을 한 다음에 자리 올림 1과 6이라고 계산하고 다시 1 + 2 + 1 (자리올림)을 계산해서 46이라는 값을 얻게 된다.

10진 덧셈 2바이트 덧셈
올림 1 1
1 9 1E 2F
+ 2 7 + 3A E0
4 6 59 0F

위의 표에서와 같이 10진 덧셈이나 바이트 단위의 덧셈 모두 첫번째 자리에서 먼저 덧셈을 한 다음에 올림 값을 포함해서 윗자리의 덧셈을 하게 된다. 문제는 이 덧셈방식이 사람의 감각을 기준으로 해서 진행되는 것 이다. 실제 8비트 컴퓨터에서 16비트 - 2바이트 덧셈을 한다면 방법이 복잡해 진다. 변수는 메모리 공간 이라고 했던 것을 기억 할 것이다. 그렇기 때문에 실제로 8비트 컴퓨터가 하는 덧셈 이라는 것은 먼저 메모리에서 덧셈을 할 데이터를 두개 꺼내서 덧셈을 하고 두 값을 더한 다음에 다시 메모리에 넣는 세 단계 작업을 의미한다. 그림으로 그린다면 다음과 같다.

1 바이트 덧셈
1 바이트 덧셈

8비트 컴퓨터에서 16비트 덧셈을 수행하는 것은 조금 더 복잡하다. 먼저 아랫자리 1바이트 두개를 읽어 더한 다음 자리 올림을 확인하고, 더한 결과를 아랫자리 1바이트 영역에 저장해 둔다. 그 다음 윗자리 1바이트 두개를 읽고 자리 올림과 함께 더해 윗자리 1바이트 영역에 넣어 줘야 한다. 문제는 변수의 메모리 영역을 표시할 때 아랫자리의 위치를 표시하는 것이 아니라 윗자리의 위치를 기준으로 한다는 것이다. 그렇기 때문에 윗자리의 메모리 위치를 얻어낸 다음에 아랫자리 위치를 구하기 위해 메모리 위치 계산을 한번 해야 한다는 것이다. 그리고 위치 계산을 한 값을 가지고 더할 값을 꺼내서 더한 다음 비슷한 과정을 거쳐 저장할 위치를 계산해 내서 값을 저장한다. 아랫자리를 계산하기 위해 덧셈을 세번이나 더 해야 하고, 기준값을 유지하는 작업을 해야 하기 때문에 메모리를 더 필요로 하거나 복잡한 절차를 거처야 한다.

2 바이트 덧셈
2 바이트 덧셈

하지만 위의 그림에서 윗자리에 해당되는 바이트와 아랫자리에 해당되는 바이트를 바꾸면 위와 같은 복잡한 절차를 거치지 않더라도 아랫자리를 더한 다음에 결과를 넣고, 메모리 위치를 1증가 시킨 다음에 윗자리를 더하면 되므로 연산의 수가 줄어들고 연산의 복잡도 역시 줄어들게 된다. 실상 대부분의 CPU에는 인덱스드 모드(indexed mode)라는 연산 방식이 있어 여러자리의 연산을 쉽게 할 수 있도록 하는 어셈블리 명령이 별도로 존재하지만 아무래도 상대적으로 오래된 CPU들은 위에 설명한 방식으로 연산을 수행해야 했기 때문에 연산의 복잡도를 낮추기 위해 아랫자리와 윗자리를 바꿔서 저장을 했다.

아랫 자리와 윗 자리를 바꿔넣는 형태의 데이터 저장방식을 리틀 엔디언(little-endian)이라 하며, 이 방식을 사용하는 가장 대표적인 CPU로는 Intel의 x86 계열의 CPU들이 있다. 반대로 아랫 자리와 윗자리를 바꾸지 않고 그대로 저장하는 방식을 빅 엔디언(big-endian)이라 하며 네트워크를 통해 전송할 때에는 이 형태로 전송 하도록 약속되어 있다. 또한 빅 엔디언을 사용하는 CPU중에 가장 알기 쉬운 것은 매킨토시에서 사용되는 모토롤라의 68계열의 CPU들이다.

빅 엔디언과 리틀 엔디언을 통틀어 엔디언혹은 바이트오더 라고 하며 한 시스템이 아닌 여러 시스템에서 공통적으로 사용되는 데이터를 다룰 때, 특히 네트워크를 통해 데이터를 전송하는 경우에는 엔디언 - 바이트 오더 문제를 반드시 고려해야만 한다.[2]


주석 및 참고 자료편집

  1. 물론 실제적으로는 여러가지 이유에 의해서 두 배 정도가 아니라 몇배에서 수십배 이상의 속도 차이가 납니다. 그 위에 이 n 비트 컴퓨터라는 용어에 대한 수많은 의견이 있기 때문에 이렇게 한마디로 정의해 버리기엔 여러가지 불편한 점이 많기는 하지만, C 언어를 배우는데 있어 가장 필요한 정보만 제공한다는 의미에서 필요 이상으로 용어의 정의에 있어야 할 이야기들을 가지쳐 버렸습니다.
  2. 일반적으로 네트워크를 통해 데이터를 전송 할 때엔 빅 엔디언으로 전송을 합니다. 네트워크를 통해 전송할 때 사용해야 하는 바이트 오더라는 의미로 네트워크 프로그래밍을 할 때엔 빅 엔디언 이라는 용어 보다는 '네트워크 오더'라는 용어를 더 많이 사용합니다. 네트워크를 통해 데이터를 전송할 때엔 상대방 프로그램 외에도 중간에 거쳐야 하는 여러 네트워크 장비를 거쳐야 하기 때문에 오로지 자신이 만든 두 프로그램 사이에서 통신을 하는 경우에라도 데이터, 특히 네트워크 전송시 사용되는 패킷의 해더 정보는 반드시 네트워크 오더로 변환하는 작업을 해야만 합니다.
닫기

이 문서를 개선하는 데 도움을 주세요!

로그인

이 문서의 모든 바뀜을 추적합니다.

로그인

'language > C' 카테고리의 다른 글

time 함수  (0) 2015.04.21
C 언어와 C++ 언어에서 const 처리  (0) 2015.03.16
2차원 배열 크기 구하기  (0) 2013.01.15
printf format string  (0) 2012.01.18
gcc option  (0) 2011.10.26
반응형
char i[2][3];

printf("i[2][3]:%d\n",sizeof(i));

결과: i[2][3]:6


'language > C' 카테고리의 다른 글

C 언어와 C++ 언어에서 const 처리  (0) 2015.03.16
long long 입출력 관련  (0) 2015.01.28
printf format string  (0) 2012.01.18
gcc option  (0) 2011.10.26
callback 함수  (0) 2011.10.06
반응형
http://itguru.tistory.com/64
http://en.wikipedia.org/wiki/Printf_format_string



fprintf

#include <stdio.h> // C++ 에서는 <cstdio>

int fprintf ( FILE * stream, const char * format, ... );

데이터를 형식에 맞추어 스트림에 쓴다. 
특정한 스트림에 일련의 데이터를 특정한 형식에 맞추어 쓰게 된다. 이 때, 그 형식은 형식 문자열에 지정되어 있으며, 출력할 데이터는 형식 문자열 다음에 오는 인자들에 써주면 된다. 

   인자
 

stream

작업을 수행할 스트림의 FILE 객체 

format

C 문자열로 스트림에 써질 텍스트를 포함하고 있다.
또한 이 문자열에는 형식 태그를 부수적으로 포함할 수 있는데 이는 각각의 형식 태그에 대응되는 인자의 데이터가 형식 태그가 지정하는대로 치환된다. 
따라서, 이 문자열에 포함되어 있는 형식 태그의 수는 뒤에 부수적으로 오는 인자의 개수 보다 언제나 같거나 적어야 한다. 
 
형식 태그는 다음과 같은 꼴로 써야 한다. 

%[플래그(flag)][폭 (width)][.정밀도][크기(length)]서식 문자(specifier)

이 때, 형식 태그에서 가장 중요한 부분은 서식 문자로 이는 이 형식 태그에 대응되는 인자의 값이 어떠한 형태로 출력되는지를 조정해 준다. 

서식문자출력 형태

c 문자
a
d or i 부호 있는 십진법으로 나타난 정수 392
e 지수 표기법(Scientific notation) 으로 출력하되, e 문자를 이용한다. 
3.9265e+2
E 지수 표기법(Scientific notation) 으로 출력하되, E 문자를 이용한다. 3.9265E+2
f 십진법으로 나타낸 부동 소수점 수 392.65
g %e나 %f 보다 간략하게 출력 392.65
G %E나 %f 보다 간략하게 출력 392.65
o 부호 있는 팔진수
610
s 문자열
sample
u 부호없는 십진법으로 나타낸 정수
7235
x 부호없는 16 진법으로 나타낸 정수 (소문자 사용)
7fa
X 부호없는 16 진법으로 나타낸 정수 (대문자 사용)
7FA
p 포인터 주소
B800:0000
n 아무것도 출력하지 않는다. 그 대신, 인자로 부호 있는 int 형을 가리키는 포인터를 전달해야 되는데, 여기에 현재까지 쓰여진 문자 수가 저장된다.
% % 다음에 %를 또 붙이면 stdout 에 % 를 출력한다. 


  • 위 서식 문자를 이용한 다양한 출력 형태는 아래와 같다.

  • #include <stdio.h>
    int main()
    {
        FILE *fp = fopen("output.txt", "w");
        int integer = 123;
        char character = 'c';
        char string[] = "hello, world";
        int* pointer = &integer;
        double pi = 3.141592;

        fprintf(fp, "integer : (decimal) %d (octal) %o \n", integer, integer);

        fprintf(fp, "character : %c \n", character);

        fprintf(fp, "string : %s \n", string);

        fprintf(fp, "pointer addr : %p \n", pointer);

        fprintf(fp, "floating point : %e // %f \n", pi, pi);

        fprintf(fp, "percent symbol : %% \n");

        return 0;


  • 출력 결과




  • 파일의 모습



    output.txt 에 우리가 형식 문자열에서 지정해준대로 잘 표시되었음을 알 수 있다. 또한, 콘솔에는 출력을 하지 않았으므로 콘솔에는 아무것도 표시되지 않았다.

    형식 태그에는 위 말고도 플래그, 폭, .정확도, 제한자(modifier), 부-서식문자(sub-specifiers) 에 관련한 정보들이 포함될 수 있다. 먼저 플래그를 살펴보면 플래그는 기본적으로 출력되는 형태에 대해 조금 더 자세하게 지정할 수 있게 해준다. 플래그는 아래와 같다. 

    플래그설명
    - 폭에 맞추어 왼쪽 정렬을 하여 출력한다. - 를 붙이지 않는다면 기본적으로 오른쪽 정렬이 되어 출력한다. (아래 폭 지정자 참조).
    + 출력 결과값이 양수인 경우라도 + 기호를 앞에 붙여서 출력하도록 한다. (물론 음수면 자동적으로 - 가 붙는다). 기본적으로 지정하지 않았을 경우 음수에만 앞에 - 가 붙는다. 
    (공 백) 앞에 부호가 붙지 않는다면 한 칸을 띄어서 출력한다. (다시말해 123 은 " 123" 으로 출력되고 -123 은 "-123" 으로 출력된다)
    #
    o, x, X 서식 문자들과 사용되면 출력되는 값 앞에 각각 0, 0x, 0X 가 붙게 된다. (이 때 0 은 제외한다)
    e, E, f 서식 문자들과 사용되면 소수점 아래 수들이 없음에도 불구하고 강제적으로 소수점을 붙이도록 한다. 원래 소수점 아래 수들이 없다면 소수점을 붙이지 않는다. 
    g 와 G 서식 문자들과 사용되면 e 와 E 일때와 동일한 작업을 하지만 소수들의 뒷부분에 붙는 0 들 (123.1200 등) 은 제거되지 않는다. 
    0 수들을 왼쪽으로 정렬하되 빈 칸을 삽입하는 대신에 0 을 삽입한다. (폭 지정자 참조)

  •   폭은 말그대로 출력되는 데이터의 폭을 지정해준다. 참고로 여기서의 폭(width)은 뒤에 나오는 길이(length) 와는 완전히 다른 개념이므로 유의 하시기 바란다. 


  • 설 명
    (수) 출력할 최소의 문자 개수. 만일 이 수 보다 출력할 수 보다 작다면 빈칸을 삽입하여 길이를 맞춘다. 대신에, 이 수 보다 출력할 수가 큰 수의 경우 잘려서 출력되지는 않는다. 
    * 폭을 형식 문자열에 지정해서 받지 않지만, 그 대신에 형식 문자열 뒤에 오는 인자들에 넣어서 받는다. 이 때, 이는 정수 값이여야 하며 폭을 지정하는 변수 뒤에 출력할 데이터가 위치하면 된다. 

  • /* 사용 예 */
    #include <stdio.h>
    int main()
    {
        FILE *fp = fopen("output.txt", "w");
        int i = 123;
        int j = -123;
        double f = 3.141592;

        fprintf(fp, "폭 맞추기 \n");
        fprintf(fp, "i : %6d \n", i);
        fprintf(fp, "i : %7d \n", i);
        fprintf(fp, "i : %2d \n\n", i);

        fprintf(fp, "왼쪽 정렬 \n");
        fprintf(fp, "i : %5d끝 \n", i);
        fprintf(fp, "오른쪽 정렬 \n");
        fprintf(fp, "i : %-5d끝 \n\n", i);

        fprintf(fp, "# 문자의 사용 \n");
        fprintf(fp, "i : %#x \n", i);
        fprintf(fp, "i : %#X \n\n", i);

        fprintf(fp, "부호 붙이기 \n");
        fprintf(fp, "%+d, %+d \n", i,j);
        return 0;
    }

  • 출력 결과

  • 파일에 출력된 모습

  • 이전의 예제와 같이 output.txt 에 우리가 지정한 방식대로 잘 출력되었음을 볼 수 있다. 
    정밀도는 말그대로 수치 데이터를 출력할 때 어떠한 정밀도로 출력하는지 (즉, 몇 자리 까지 출력해야 되는지) 를 지정해준다. 참고적으로 정밀도를 나타낼 때, 앞에 꼭 마침표(.) 을 찍는 것을 잊지 말기 바란다. 마침표를 찍는 이유는 앞에 폭과 구분을 하기 위해서 이다. 

  • . 정밀도설명
    .숫자 정수 지정자 (d,i,o,u,x,X) 의 경우 : 정밀도는 출력되야할 최소의 자리수를 일컫는다. 만일, 어떤 정수의 자리수가 정밀도 보다 작다면 앞에 0 이 붙어서 자리수를 맞추게 된다. 또한 자리수가 더 크다고 해서 정수를 잘라서 출력하지는 않는다. 만일 정밀도가 0 이라면, 소수점 뒤에 자리수를 출력하지 않는다.
    e,E, F 의 경우 : 여기서 정밀도는 소수점 이하 출력될 자리수를 의미한다. 
    g, G 의 경우 : 출력될 유효 숫자의 수를 의미한다.
    s 의 경우 : 출력될 문자의 최대 개수를 의미한다. 원래는 널 문자를 만나기 전까지 모든 문자가 출력되었었다.
    c 의 경우 : 아무 효과 없다.
    만일 정밀도가 지정되지 않는다면 기본값으로 1 이 된다. 또한, 마침표(.) 을 찍었는데 아무런 숫자를 적지 않았다면 기본적으로 0 이 적혔다고 생각한다. 
    .* 형식 문자열에서 정밀도를 나타내지는 않지만 뒤에 인자로 정밀도 값을 준다. 이 때 인자는 형식 태그가 적용되는 데이타 앞에 있어야 한다.  

       길이는 출력하는 데이터의 정확한 크기를 지정하는데 사용된다. 예를 들어서 %d 서식문자의 경우 막연하게 '정수형 데이터를 십진법으로 출력한다' 였지만 길이를 지정해주면 어떻나 크기로 데이터를 출력해야되는지 (int 냐 short 냐 등등) 을 지정할 수 있다. 

  • 길이
    설 명
    h 인자를 short int 혹은 unsigned short int 로 생각한다. (오직 i, d, o, u , x, X 서식 문자에만 적용된다)
    l 정수 서식 문자(i,d,o,u,x, X) 에 사용되었을 경우 인자를 long int 나 unsigned long int 로 생각하며 c 나 s 에 사용되었을 경우 wide character 나 wide string 으로 생각한다.
    L 인자를 long double 로 생각한다. (오직 부동 소수점 서식 문자인 e,E,f,g, G 에만 적용된다)

  • /* 사용 예 */
    #include <stdio.h>
    int main()
    {
        double f = 3.141592;
        int i = 12345;

        fprintf(stdout, "f : %.3f \n", f);
        fprintf(stdout, "i : %.10d \n", i);

        return 0;


    출 력 결과


    이번에는 파일 스트림에 출력하는 것이 아니라 표준 출력(stdout), 즉 콘솔 화면에 출력을 해 보았다. 역시 우리가 지정한 형식대로 잘 출력된다. 

    부수적인 인자


    형식 문자열에 따라 함수는 여러 인자들을 가지며, 각 인자는 형식 문자열의 각 형식 태그에 순차적으로 대응된다. 기본적으로 형식 문자열에 들어 있는 형식 태그의 수와 뒤따라 붙는 인자들의 수는 같아야 한다. (물론 .* 이나 * 과 같은 예외적인 상황은 제외한다)

       리턴값
     

    출력 성공시, 화면에 출력된 총 문자의 개수를 반환한다.
    실패했다면 음수가 반환된다.

       실행 예제
     

    /* 

    사용자로 부터 이름을 입력받아 이를 깔끔하게 myfile.txt 에 기록한다.
    이 예제는 http://www.cplusplus.com/reference/clibrary/cstdio/fprintf/
    에서 가져왔습니다. 

     */
    #include <stdio.h>
    int main ()
    {
        FILE * pFile;
        int n;
        char name [100];

        pFile = fopen ("myfile.txt","w");
        for (n=0 ; n<3 ; n++)
        {
            puts ("please, enter a name: ");
            gets (name);
            fprintf (pFile, "Name %d [%-10.10s]\n",n,name);
        }
        fclose (pFile);

        return 0;
    }


    실행 결과


    파일에 출력된 모습


    fprintf 에서 사용한 형식 문자열에 대해 설명을 하자면

    %-10.10s

    먼저 봐야 할 것은 서식 문자인데, s 는 데이터를 문자열로 출력하라는 것이다. 맨 앞의 - 는 문자열을 "왼쪽 정렬" 해서 출력하라는 의미 이다. 그 뒤에 10 은 최소 10 개의 문자를 출력하라는 뜻으로 길이가 10 미만인 문자열은 공백으로 길이를 맞춘다. Psi 다음에 쭉 위치한 공백이 그것이다. 그리고 .10 은 최대 10 문자를 출력하라는 뜻으로 10 문자가 넘으면 잘리게 된다. 위에 Genious Psi 가 잘려서 Genious Ps 까지 출력된 것을 볼 수 있다. 

       연관된 함수
     

    • printf  :  특정한 형식에 맞추어 데이터를 stdout 에 출력한다.
    • fscanf  :  특정한 형식에 맞추어 스트림에서 데이터를 읽어온다.
    • fwrite  :  스트림에 데이터 블록을 쓴다.
    • fputs  :  스트림에 문자열을 쓴다.

    'language > C' 카테고리의 다른 글

    long long 입출력 관련  (0) 2015.01.28
    2차원 배열 크기 구하기  (0) 2013.01.15
    gcc option  (0) 2011.10.26
    callback 함수  (0) 2011.10.06
    데이터 타입  (0) 2011.07.14
    반응형
    출처 : http://www.dreampharos.com/
    퍼온곳: http://psjin14.egloos.com/2989814

    [gcc 컴파일]

    1) gcc 파일명(*.c) : Default로 out 파일이 생성된다. (ex a.out)
    2) gcc -c 파일명(*.c) : 오브젝트 파일을 생성한다.
    3) gcc -c 오브젝트_파일명(*.o) 파일명(*.c)
        gcc -o 실행파일명(*.out) 오브젝트_파일명(*.o)
     

    4) gcc -o 실행파일 파일명(*.c) : 실행 파일을 만든다. (3번을 한줄로...)

        (소스 파일 컴파일 → 오브젝트 파일 생성 → 실행파일 생성 → 오브젝트 파일 삭제) 

     

    ===================================================================================================

     [gcc 옵션]

    1. -Wall 옵션 : 모든 모호한 코딩에 대해서 경고를 보내는 옵션
    2. -W 옵션 : 합법적이지만 모호한 코딩에 대해서 경고를 보내는 옵션
    3. -W -Wall 옵션 : 아주 사소한 모호성에 대해서도 경고가 발생
    4. O2 옵션 : 최적화 레벨 2로 설정. (대부분의 최적화를 시도)
    5. -E 옵션 : 전처리 과정의 결과를 화면에 보이는 옵션 (전처리과정 중 발생한 오류를 검증)
                     ※ enhanced Tip: --save-temps 옵션 
     

    6. -S 옵션 : cc1으로 전처리된 파일을 어셈블리 파일로 컴파일까지만 수행하고 멈춘다. (*.s)

    7. -c 옵션 : as에 의한 어셈블까지만 수행하고 링크는 수행하지 않는다.
    8. -v 옵션 : gcc가 컴파일을 어떤 식으로 수행하는지를 화면에 출력한다.
    9. --save-temps 옵션 : 컴파일 과정에서 생성되는 중간 파일인 전처리 파일(*.i)과 어셈블리 파일(*.s)을 
                                     지우지 않고, 현재 디렉토리에 저장한다. (오류 분석에 사용)

     ===================================================================================================

     [cpp0 옵션]
    : 소스내에서 사용된 헤더 파일과 define 매크로와 관련된 옵션들이다.
      전처리 과정에서 오류가 발생한다면 cpp0 옵션들을 점검해야 한다.

     1) -l 옵션 : 전처리 과정에서 헤더 파일을 탐색하는 기본 디렉토리를 추가할 때 사용하는 옵션
    2) -include 옵션 : 헤더 파일을 소스내에 추가할 때 사용한다.
    3) -D[매크로] 옵션 : 매크로를 외부에서 define 할 때 사용한다.
    4) -D[매크로]=[매크로 값] 옵션 : 소스 내에 #define [매크로] [매크로 값] 옵션을 추가한 것과 동일하다.

    5) -U[매크로] 옵션 : -D와 반대로 소스 파일 내에 #undef[매크로] 옵션을 추가한 것과 동일하다.

    6) -M / -MM 옵션 : -M 옵션 - make를 위한 소스 파일의 모든 종속 항목을 출력
                                -MM 옵션 - 기본 include 디렉토리에 있는 헤더 파일은 빼고 종속 항목을 출력한다.

     7) -nostdinc 옵션 : 디폴트 include 디렉토리(usr/include)에서 헤더 파일을 탐색하지 않고,
                               -l 옵션으로 추가한 디렉토리에서만 헤더 파일을 찾는다.

     8) -C 옵션 : -E 옵션과 함께 사용하며, 전처리 과정에서 주석을 제거하지 않는다.
    9) -Wp,[옵션들] 옵션 : 만약 cpp0와 gcc의 옵션이 같은 것으로 중복되면 gcc 옵션으로 해석되므로...

                                    gcc의 해석을 거치지 않고 바로 cpp0 옵션으로 전달하고 싶을 때 사용한다.        

     ===================================================================================================

     [cc1 옵션]
    : "C언어 옵션, 경고 옵션, 최적화 옵션, 디버깅 옵션"의 4가지 종류
      "경고 수위 조절 or 최적화 수위 조절"을 하고 싶을 때 사용한다.

     1. C언어 옵션 : C언어 종류와 표준에 관련된 옵션
       1) -ansi 옵션 : ANSI C 표준에 부합하는 소스를 작성하고자 할 때 사용하는 옵션 
       2) -std=[C 표준들] 옵션 : 기타 다른 표준들을 지정하고자 할 때 사용한다.
       3) -traditional 옵션 : 오래된 Traditional C 문법으로 문법을 검사한다.
       4) -fno -asm 옵션 : gnu89 문법을 바탕으로 asm, inline, typeof 키워드를 사용하지 않기를 원할 때 
                                   사용한다.
        

    2. 경고 옵션 : cc1의 옵션을 조정하여 경고 수위를 조절할 수 있다.
       1) -W / -Wall 옵션 (gcc 옵션 참고)
       2) -w(소문자) 옵션 : 모든 경고 메시지를 제거한다.
       3) -Werror 옵션 : 모든 경고를 컴파일을 중단하는 오류로 취급한다. 

                               (경고가 하나만 나와도 컴파일이 중단된다.)

       4) -pedantic 옵션 : ANSI C89 표준에서 요구하는 모든 경고 메시지를 표시한다.
       5) -pedantic-errors 옵션 : ANSI C89 표준에서 요구하는 모든 오류 메시지를 표시한다.
       6) -Wtraditional 옵션 : 소스가 ANSI C와 K&R C 간에 서로 다른 결과를 가져올 수 있는 부분이 있다면 
                                      경고한다. 

    3. 최적화 옵션 : ⓐ 실행 파일의 크기를 줄여 메모리와 하드디스크의 사이즈를 절약 (큰 의미 X)
                             ⓑ 실행 파일의 크기를 줄여 실행 속도를 향상시키는 것.

        1) -O0 옵션 : 최적화를 수행하지 않는다.
       2) -O1 옵션 : -O0보다는 조금 낫다. 
       3) -O2 옵션 : 가장 많이 사용하는 옵션. 일반 응용 프로그램이나 커널을 컴파일 할 때 사용
                          (거의 대부분의 최적화를 수행한다.)

       4) -O3 옵션 : 가장 높은 레벨의 최적화. 모든 함수를 인라인 함수와 같이 취급한다.               
                          (Call 인스트럭션은 사용 X. but, 되도록이면 사용하지 않는 것이 좋다. 
                              → 너무나 많은 소스의 변경이 가해지기 때문에 왜곡이 발생할 위험이 있다.)

       5) -O5 옵션 : 사이즈 최적화를 실행한다. (공간이 협소한 곳에서 사용 - 임베디드 시스템)

     

     4. 디버깅 옵션
       1) -g 옵션 : gdb에게 제공하는 정보를 바이너리에 삽입한다.
                    (-g 옵션을 사용하지 않고 gdb로 디버깅하면, 역어셈 → 어셈블리 코드로만 디버깅 가능)

       2) -pg 옵션 : 프로파일을 위한 코드를 삽입한다. 
                     (-pg 옵션으로 컴파일 → gmon.out(프로파일 정보) → gprof로 gmon.out 파일 분석)

    ===================================================================================================

    [as의 옵션]
    : gcc는 as의 옵션에 대해서는 알지 못한다. -Wa,[as 옵션들] 형식으로 gcc를 거치지 않고 
      바로 전달해야 한다. -Wa, -al, -as와 같은 형식으로 사용하면 as에게 -al -as 옵션이 같이 전해진다.

     -Wa,[as 옵션들]
    1) -al 옵션 : 어셈블된 인스트럭션을 보인다.
    2) -as 옵션 : 정의된 심볼을 보인다.
    3) -l[패스] 옵션 : include 디렉토리를 지정한다. 어셈블리 소스 내에서 사용된 include 지정자가 
                       지정하는 헤더파일을 찾고자 할 때 사용한다.
    4) -W / --no-warn : 경고 메시지를 출력하지 않는다.
    5) -march=[아키텍처 문자열] : 해당 어셈블리

     ===================================================================================================

     [collect2 / ld 옵션]
    : 링크 옵션

     1) -L[라이브러리 디렉토리] 옵션 : 라이브러리를 찾을 디렉토리를 지정한다.
    2) -l 옵션 : 같이 링크할 라이브러리를 지정한다.
    3) -shared 옵션 : 공유 라이브러리와 정적 라이브러리가 같이 있을 경우, 공유 라이브러리를 우선하여
                             링크한다. (아무 옵션을 주지 않아도 공유 라이브러리를 우선으로 링크한다.)

     4) -static 옵션 : 정적 라이브러리와 공유 라이브러리가 같이 있다면, 정적 라이브러리를 우선하여
                           링크한다. (속도는 빠르지만 파일 사이즈가 커진다는 점 고려할 것!)

     5) -nostdlib 옵션 : 링크시에 표준 C 라이브러리를 사용하지 않는다. 
                              (OS, 부트로더와 같은 프로그램을 컴파일 할 때 사용)

     6) -nostartfiles 옵션 : crt1.o 등과 같은 start up 파일을 링크하지 않는다.
                              (OS, 부트로더와 같은 프로그램을 컴파일 할 때 사용)

     7) -Wl,[링크 옵션들] 옵션 : gcc를 거치지 않고 바로 링크에게 옵션을 정해주고자 할 때 사용한다.
                                          (사용법은 -Wa와 동일한다.)
       
       < 유용한 링크 옵션들 >
       ① -s 옵션 : 실행 파일에서 심볼 테이블을 제거
       ② -x 옵션 : 출력 파일에서 로컬 심볼 제거
       ③ -n 옵션 : 텍스트 영역을 읽기 전용으로 만듬
       ④ -r 옵션 : 추후 링크가 가능하게 오브젝트를 만듬
       ⑤ -e [name] 옵션 :  시작 심볼을 name 심볼로 사용 (default 시작심볼 : _start 심볼)
       ⑥ -M 옵션 : 심볼들의 정보를 자세하게 출력
       ⑦ oformat [format] 옵션 : 주어진 형식의 오브젝트 파일을 생성

    =============================================================================================================

    'language > C' 카테고리의 다른 글

    2차원 배열 크기 구하기  (0) 2013.01.15
    printf format string  (0) 2012.01.18
    callback 함수  (0) 2011.10.06
    데이터 타입  (0) 2011.07.14
    컴파일 오류 메세지  (0) 2011.07.07
    반응형

    http://kldp.org/node/105616

    다른 곳에서 나를 호출할 수 있도록 해 주는 것??

    'language > C' 카테고리의 다른 글

    printf format string  (0) 2012.01.18
    gcc option  (0) 2011.10.26
    데이터 타입  (0) 2011.07.14
    컴파일 오류 메세지  (0) 2011.07.07
    bool  (0) 2011.07.07
    반응형

    'language > C' 카테고리의 다른 글

    gcc option  (0) 2011.10.26
    callback 함수  (0) 2011.10.06
    컴파일 오류 메세지  (0) 2011.07.07
    bool  (0) 2011.07.07
    int vs char 차이  (0) 2011.07.07
    반응형

    1. Implicit declaration
    http://hezekiah81.blog.me/140026550064

    2. suggest parentheses around assignment used as truth value
    http://cafe.naver.com/mcbugi/38464

    'language > C' 카테고리의 다른 글

    callback 함수  (0) 2011.10.06
    데이터 타입  (0) 2011.07.14
    bool  (0) 2011.07.07
    int vs char 차이  (0) 2011.07.07
    warning - array subscript has type `char'  (0) 2010.01.06
    반응형

    결론>
    linux에서 include<stdbool.h>을 이용하자.

    함수의 리턴 데이터 타입은 bool로 기록하여 함수만 봐도 리턴값을 예측할 수 있도록 하자
    비교문 안에 true, false와 직접적으로 기록하지 말자
    예) if(a==true)

    stdbool.h 파일 내용


     





    출처>

    http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/FAQ/CfaqHTML/node11.html#9.1

    'language > C' 카테고리의 다른 글

    데이터 타입  (0) 2011.07.14
    컴파일 오류 메세지  (0) 2011.07.07
    int vs char 차이  (0) 2011.07.07
    warning - array subscript has type `char'  (0) 2010.01.06
    extern  (0) 2009.07.02
    반응형
    결론>
    - int가 char보다 속도가 빠르다.
     - 메모리가 부족하다면 char, 아니라면 int
     - 데이터 타입이 다른 것끼리 연산할 경우 반드시 데이터 타입을 동일하게 형변환하여 연산
        그렇지 않으면, 컴파일 오류가 발생하지 않아도 결과가 어떻게 나올 지 판단하기 어려움

    http://blog.chanywa.com/44
    http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/1/true
    http://webcache.googleusercontent.com/search?q=cache:aGUlS59ZMQ8J:wowmymwow.tistory.com/attachment/cfile2.uf%40152510254B146EEC70A751.txt+int+char+%EC%86%8D%EB%8F%84&cd=2&hl=ko&ct=clnk&gl=kr&source=www.google.co.kr
    http://cafe.naver.com/carroty/128725
    http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=71271317&qb=aW50IGNoYXIg7IaN64+E&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=gmR6Qg331xlssttId5Vssv--047643&sid=ThUCs9zpFE4AACGOIas

    'language > C' 카테고리의 다른 글

    컴파일 오류 메세지  (0) 2011.07.07
    bool  (0) 2011.07.07
    warning - array subscript has type `char'  (0) 2010.01.06
    extern  (0) 2009.07.02
    BCD(binary Coded Decimal)  (0) 2009.06.23
    반응형

    gcc에서 배열을 읽을때, 배열을 읽는 값을 unsigned 형으로 하지 않을 경우 생기는 경고이다

     

    char temp[20];

    char arr_idx = 0;

     

    temp[arr_idx];

     

    라고 했을 경우, arr_idx의 값이 char형이라서 음수가 될수도 있으므로 이를 방지하기 위해

    gcc에서 경고를 발생시킴

    'language > C' 카테고리의 다른 글

    bool  (0) 2011.07.07
    int vs char 차이  (0) 2011.07.07
    extern  (0) 2009.07.02
    BCD(binary Coded Decimal)  (0) 2009.06.23
    gcc설치하여 vim으로 편집하기  (0) 2009.05.19

    + Recent posts