'sizeof() 연산자'에 해당되는 글 2건

  1. 2010.07.18 sizeof
  2. 2009.04.26 상수와 기본자료형
Objective C/C언어 기능2010. 7. 18. 13:00

sizeof 자료형의 길이를 바이트 단위로 얻을 있다.

가령 int형의 인스턴스를 sizeof 사용하여 구하면

4라는 값을 구한다. 4바이트를 의미한다.

또는 int ary[] = {1,2,3,4,5,6,7,8};

에서 ary 값을 구하면 32바이트라고 있다.

이는 4바이트씩 8개가 들어가므로 32바이트를 할당받은 것이다.


sizeof 역으로 배열의 길이를 있다.

위에 ary 길이를 알아본다면 아래와 같다,

sizeof(ary)/sizeof(int)

이는 배열에 할당된 바이트에 배열원소의 자료형으로 나누면

간단히 배열의 길이를 있다.

구조체배열에서는 자료형이 여러가지 있으므로

까다로운 작업이 있어야 것이다.

 


int sum_ary( int * n_ary, int index )

{

int i, sum=0;

for( i=0; i<index; i++ ){

sum += *(n_ary + i);

}

return sum;

}


int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

int ary[] = {1,2,3,4,5,6,7,8}; 

int serve_sum;

NSLog(@"sizeof(ary)=%i",sizeof(ary) );

//32 출력 이는 4바이트씩 8개이므로 1바이트씩 32바이트를 출력

//배열 ary 원소구간을 자료형으로 나누면 정확한 배열의 길이를 있다.

NSLog(@"index of array=%d", sizeof(ary)/sizeof(int) );

//8 출력

//길이 8 배열을 4 입력하여 더하므로 36 출력

serve_sum = sum_ary(ary, sizeof(ary)/sizeof(int) );

NSLog(@"sum of array's factors : %d", serve_sum);

[pool drain];

    return 0;

}

Posted by 버터백통

 * 기본자료형과 표현범위 (ANSI:표준) : int,long은 시스템에 따라 크기가 다를 수 있음
  - 메모리 공간을 적절히 사용하기 위해 다양한 자료형을 제공한다.
  - 작은 메모리 공간에 큰데이터를 저장할 경우 손실발생
    (1byte에 100만을 대입..100을 대입하려면 4byte이상 되어야 한다.)


  자료형(정수형)          할당 메모리 크기           표현 데이터 범위
  char                                      1byte                         -128 ~ 127 (2^8 : 256가지)
  short                                     2byte                         -32768 ~ 32767 ( 2^16 )
  int (과거 2byte였음)                 4byte                         -2147483648 ~ 2147483647 ( 2^32 )
  long(4byte~이상)                    4byte                         -2147483648 ~ 2147483647 (4byte인 경우)

  
  자료형(실수형)          할당 메모리 크기           표현 데이터 범위
  float                                      4byte                          3.4 * 10^-37 ~ 3.4 * 10^38
  double                                  8byte                          1.7 * 10^-307 ~ 1.7 * 10^308
  long double                           8byte이상                    시스템에 따라 차이가 많이 나타남

 * sizeof() 연산자 
  - 피연산자의 메모리 크기를 반환
  - 피연산자로 자료형의 이름이 올 경우 괄호를 반드시 사용
  - 그 이외의 경우 괄호의 사용은 선택적

 * 자료형 선택의 기준
  - 정수형 데이터의 경우
   : 컴퓨터는 내부적으로 int의 연산을 가장 빠르게 처리
   : 범위가 int형 변수를 넘어가는 경우 long으로 선언

  - 실수형 데이터의 경우
   : 선택의 지표는 정밀도
   : 최근은 일반적으로 double을 사용(값의 크기가 크므로 보다 정확함)
   
     자료형                                    정밀도
     float(4b)                                     소수점 이하 6자리
     double(8b)                                 소수점 이하 15자리(AVM1에서 사용되는 소수점 수식 데이터형)
     long double                                double의 정밀도와 같거나 크다.

  - unsigned가 붙어서 달라지는 표현 범위
   : MSB까지도 데이터의 크기를 표현
   : 양의 정수로 인식
   : 실수형 자료형에는 붙일 수 없다

  자료형(정수형)            할당 메모리 크기              표현 데이터 범위
  char                                      1byte                               -128 ~ 127
  unsigned char                        1byte                               0 ~ ( 127 + 128 )
  short                                     2byte                               -32768 ~ 32767
  unsigned short                       2byte                               0 ~ ( 32767 + 32768 )
  int                                         4byte                               -2147483648 ~ 2147483647
  unsigned int                           4byte                               0 ~ ( 2147483647 + 2147483648 )
  long                                      4byte                               -2147483648 ~ 2147483647
  unsigned long                        4byte                                0 ~ ( 2147483647 + 2147483648 )
  
 * 문자표현을 위한 ASCII코드 등장 :
컴퓨터는 2진수만 처리 가능하므로 문자와 2진수사이에 mapping을 처리한다.

  예) A:65 , B:66 (A 65 부터 Z까지 1씩 증가, 소문자는 a:97부터 1씩 증가)
  - 미국 표준 협회 ANSI에 의해 정의
  - 컴퓨터를 통해서 문자를 표현하기 위한 표준
  - 문자와 숫자의 연결 관계를 정의

 * ASCII코드의 범위
  - 0이상 127이하
  - char형으로 처리하는 것이 합리적 :  정수는 int가 합리적 이유는 연산을 위함, char는 연산을 하지
    않으므로 1byte로 처리

 * 문자의 표현

  - 따옴표( '' )를 이용, C에서는 쌍따옴표("")를 사용하지 않는다.
  예) char ch1 = 'a' -> 내부적으로 65의 값을 갖는 2진수로 저장된다.
 
 * 리터럴(Literal) 상수
  - 이름을 지니지 않는 상수
  예) int a = 30(상수) + 40(상수) => a에는 우항의 두 값을 메모리에 등록되어 CPU가 연산한 후 70이 대입
  참고) 30과 40이라는 값은 이름이 없으므로 재사용 할 수 없다.
    
  - 상수도 메모리 공간에 저장되기 위해서 자료형이 결정된다.
  예) char c='A'  : 문자상수
   int i=5   : 정수상수
   double d=3.15 : 실수상수
  참고) 좌항과 우항의 사용메모리는 서로 다르며 별도로 데이터 타입이 결정된다.
  증명) float f = 1.7 * 10^308 // 실제 메모리에 등록된 우항(double)의 크기가 좌항에서 선언한 float보다 크므로 값은 잘려서 들어가게 된다.
   
 * 심볼릭 상수
  - 이름이 있는 상수
  - const를 이용하여 상수화
  - 매크로를 이용한 상수화
  예1) const int MAX = 300;
         const double PI=3.1415;
  참고) 상수는 변수와 구분하기 위하여 대문자로 표기하는 것이 관례
 
  예2) const int MAX //상수선언(가비지 값으로 채워짐)
    MAX = 300;    //상수에 값 대입 불가.

 
 * 자료형 변환의 형태
  - 자동형 변환(묵시적 형 변환) : 자동적으로 발생하는 형태의 변환
  - 강제형 변환(명시적 형 변환) : 개발자가 명시적으로 형 변환을 요청
  
 * 자동형 변환이 발생하는 상황1
  - 대입연산 시
  예) 1.3 + 1 => 연산불가..따라서 자동으로 자료형으로 변환 후 연산가능
   int n = 5.25 //소수부의 손실( 5 ) - warning발생
   double d  = 3 //값의 표현범위( 3 -> 3.0.. )가 넒으므로 이상없음
   char c = 129 //상위비트 손실( -127 ) : 4byte에서 1byte에 저장하므로 앞의 3byte는 손실 - warning발생


 * 자동형 변환이 발생하는 상황2
  - 정수의 자동 승격에 의해(int현 연산이 빠른 이유) : 정수형 연사 자체를 int로 단일화 시켰기 때문이다.
  예) char c1 = 10, c2 = 20;
   char c3 = c1+c2 //c1과 c2는 int로 형변환 연산한 30을 다시 char로 변환하여 c3에 대입
  
 * 자동형 변환이 발생하는 상황3
  - 산술연산 과정에 의해여
  예) 5.5(double) + 7(int)    : int를 double로 변환(데이터의 손실을 자동으로 최소화 시킨다.)
   3.14f(float) + 5.25(double)   : float를 double로 변환(데이터의 손실을 자동으로 최소화 시킨다.)

  참고) [정수] char(1) -> int(4) -> long(4) -> [실수]  float(4) -> double(8) -> long double(8이상)
     순으로 변환하는 것이 손실을 최소화 시킨다.(바이트의 크기가 큰쪽으로 변환이 일어난다)

 * 강제형 변환
  - 프로그래머의 요청에 의해 변환
  예) float f = (float)3.14  : f의 값은 3.14
   double e1 = 3 + 3.14  : e1의 값은 6.14
   double e2 = 3 + (int)3.14 : e2의 값은 6

참고) 아스키 코드표


Posted by 버터백통