[ 변수 타입과 표현 범위 ]




 

long long (8byte) : -9223372036854775808 ~ 9223372036854775807

unsigned long long (8byte) : 0 ~ 18446744073709551615

long long은 "%lld" 로, unsigned long long은 "%llu" 로 표현됨

윈도우 운영체제의 경우 __int64, unsigned __int64 라는 이름으로 제공되며

"%I64d", "%I64u" 로 표현됨. (최근에는 long long도 사용가능.)

 

정수형은 signed와 unsigned에 따라 표현범위가 달라지고, 실수형은 unsigned형이 없다.  

 

 

  

─────────────────────────────────────────────

 

 [ 부동 소수점의 표현 ]

 

실수의 표현은 정수.소수 의 형식이 기본이다. 예를들어 1.23 처럼. 소수의 특성상 데이터의 표현에 한계가 있기때문에 부동소수점을 사용하면 더 큰 범위의 표현을 할수있다.

e-n 또는 e+n 을 사용하면 소수점을 -n만큼, 또는 +n만큼 이동시키는 표현이 된다. 

 

 1.23e-3

 0.00123

 1.23e-2

 0.0123

 1.23e+3

 1230

 1.23e+2

123 

  

 

 

소수점의 자릿수가 -n만큼 또는 +n만큼 이동하였음을 알수있다.

소수점의 자릿수에따라 표현범위가 적어진다는 단점을 보완한 방법이다. 

 

 

 

─────────────────────────────────────────────

 

 

 [ 서식 문자 ] 



 

scanf 명령으로 실수를 입력받을때는 데이터형에 주의해야 하는데,

float형의 데이터를 입력받을때는 %g를, double 또는 long double형의 데이터를 입력받을때는 %lg 로 구분한다.

실수를 %f 또는 %e로 입력받을때도 %lf 와 %le 로 구분해서 입력받아야 한다.

 

 

 

 

 [ 출력 예시 ]

 

 

printf("%d", 10);      //10진 정수 10 출력

printf("%s", "abcd"); //문자열 abcd 출력

printf ("%X", 0xff);   //16진수 FF (10진수 255) 출력

printf("%s", p);        //배열 또는 포인터변수 p가 가진 문자열 데이터를 출력

 

scanf("%d", &a);      //변수 a에 대해 10진 정수값을 입력

scanf("%s", p);        //포인터 또는 배열형변수 p에 대해 문자열을 입력

 


 

 [ 진수 ]

 

2진수 => 0~1

8진수 => 0~7

16진수=> 0~9, a~f 



─────────────────────────────────────────────

 

부호비트가 1이면 음수 0이면 양수다. (부호비트는 [1]0000000 )

 

음수를 표현할 때에는 2의 보수 체계를 기억해야 한다.

 

00000101 = 10진수 +5 가 된다.

 

이것을

 

11111010 ->1의 보수를 취한다.

11111011 ->1을 더한다. 이 값이 음수 -5값이 된다.

 

이값이 왜 -5인가 하면, 2의 보수 를 취하기 전에 10진수 정수값인 5였으며,

부호의반전으로 -를 붙인거뿐 바뀐건 없다.

 

─────────────────────────────────────────────

 

 [ 비트 연산자 종류 ]

 

&

비트단위 AND

|

비트단위 OR

 

비트단위 XOR

~

비트단위 NOT

<<

왼쪽으로 이동

>>

오른쪽으로 이동

 

 

예제

 

 

 

결과


 

 

& 연산 => 둘다 1이면 1, 아니면 0

 

| 연산 => 둘 중 하나만 1이어도 1, 둘다 0일때 0

 

^ 연산 => 둘다 다르면 1, 같으면 0

 

~ 연산 => 해당변수의 모든비트를 반전, MSB(부호비트)도 반전이 되므로 음수가 됩니다. 1의 보수를 취한후 1을 더하면 음수값을 알수 있습니다.

 

<< 연산 => 비트단위로 n회 왼쪽으로 이동시킵니다. 이동한 만큼 비는 공간은 0으로 채워지며, 왼쪽 끝에 도달하여 더 이상 갈 수 없을 경우 해당 비트는 삭제됩니다. 1비트씩 이동 할 때 마다 값이 2배가 됩니다.

 

>> 연산 => 비트단위로 n회 오른쪽으로 이동 시킵니다. 이동 한 만큼 왼쪽 끝의 비트는 0으로 채워지며, 오른쪽 끝에 도달하여 더이상 갈 수 없을 경우 비트는 삭제됩니다. 그러나 음수일 경우 왼쪽의 비트 처리가 시스템에 따라 달라집니다. 음수를 유지하기 위해 1로 채워질 수도 있고, 0으로 채워질수도 있습니다.

 

─────────────────────────────────────────────

 

 [ 비트 연산의 필요성 ]

 

중요한건 비트연산을 왜쓰냐는건데 ... 

 

난!

하나의 변수에 특성,속성,옵션을 지정할때 쓴다.

 

exmaple_1. 메시지박스

 

#define DF_OKBUTTON 0x0001

#define DF_CANCELBUTTON 0x0002

 

option |= ok_button

 

검사

if( option & ok_button ){

printf("OK_button \n");

}

 

exmaple_2. 착용무기 

 

 

 

결과


 

상태 구분 방법은 BOOL 변수로 TRUE, FALSE 로 구분하는 방법은 있다.

하지만, 상태값이 3개나 10개, 30개라면 3, 10, 30개씩 BOOL값이 필요하다.

 

이는 심한 메모리 낭비를 불러오고 플래그의 상태를 확인하기 위하여 함수의 매개변수갯수가  

플래그의 갯수만큼이  것이다. 

 

8bit 8개의 상태를 체크할  있다 

int(4byte) 하나면 32개의 상태를 체크할  있다.

 

 즉!

 

iHand 변수에 무기가 여러개가 들어가게되는데, 비트연산이 아니라면 변수 하나에 무기를

바꿀수만 있지 다중으로 적용은 안된다.

배열처럼 다중 변수 선언이 되야한다.

검[0] =true;

창[1] =true;

 

하지만, 속성이 늘어날수록 변수는 늘어나고, 메모리에 비효율적인것이다.

 

ex 검, 검창, 검활, 검창활 등 경우의 수는 계속 늘어나게 된다.

 

결론은

 

비트연산은 자신의 소스에 알맞게 적용해서 사용하면 효율적이다

 

────────────────────────────────────────

 

 [ 참고 ]

 

0x00000001

0x00000002

0x00000004

0x00000008

0x00000010

 

위는 16진수 표기로 비트를 표현한건데, 16진수는 하나당 비트 4비트이다.

이건 2진수 1111 => 10진수로 15인데, 16진수는 10진수 15(f)까지 표시가 가능하다.

 

즉 16진수는 표기는 하나당 (1111)4비트가 된다. 위에 선언은 총 4 * 8 =32bit가 선언된것이다.

 

그런데 2n승의 값으로 선언이 되어있는데, 이것은 잘 만 생각해보면 이해할수있다.

 

0001 = > 1  [검]

0010 = > 2  [활]

0011 = > 3  [총]

 

2진수의 10진수로 바꾸면 이렇게 되는데,

 

hand = 0001 | 0010;

 

[검]과 [활]을 적용시키면 [총]이 된다. 머.. 이상할껀 없다. [검] [활] [총]까지 모두 검출 할 수 있다.

 

하지만, 난 분명, 검과 활만 적용시켰는데 총까지 적용되었다.

 

결과적으로 비트가 중첩되는 현상이 생겼다.

 

중첩이 된다면, 위에 예시처럼 의도 하지 않는 속성이 들어 간다.

 

 

 

2n승의 값 으로 비트를 선언해야 하겠다.

 

────────────────────────────────────────

 

 [ 옵션 함수 처리 ]

 

void SetOption(DWORD dwOption, BOOL bSet)
{
     // 옵션 적용
     if (bSet == TRUE) {
             m_dwOptions |= dwOption;

     }
     else {
             m_dwOptions &= ~dwOption; //<옵션해제

     }
}

 

 

 

+ Recent posts