변수범위 (유효자리)
* 16bit
short : –32,768 to 32,767
unsigned short, unsigned short int : 0 to 65,535
 
* 32bit
int                : –2,147,483,648 to 2,147,483,647
unsigned int    : 0 to 4,294,967,295 (= 2^32-1) = 밀리초=49일


float : 3.4E +/- 38 (7 digits) , 유효 자리 범위=2^23=8,388,608, 

- 주의! 정확한 수치는 소수점 위아래 전체 7자리만 정확,

- 소수점 계산은 double을 사용하자

- float 와 double로 나누면 '0으로 나누기 에러(divide by zero)'를 피할수 있다.


* 64bit
__int64(long long) : –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807(=2^63-1),
    밀리초=1,000억일(106,751,991,167)
unsigned __int64   : 0 to 18,446,744,073,709,551,615
double : 1.7E +/- 308 (15 digits), 유효=2^52=4,503,599,627,370,496,

밀리초=6천만일(62,549,994)



주의! '부호있는 작은 크기 변수'를 '부호없는 큰변수'에 대입할때 주의

    //
    char ch=0x80;    UCHAR uch=0x80;
    short sh=0x8123; USHORT ush=0x8123;
   
    int i =0x81234567;  UINT ui=0x81234567;
    long l=0x81234567; ULONG ul=0x81234567;//=UINT
    DWORD dw=0x81234567;//=UINT

    INT64    i64=0x8000000000000, i642=0x8000000000000;
    UINT64    ui64=0x8000000000000, ui642=0x8000000000000;

    float fl=0x800000 , fl2=0x800001;
    double db=0x10000000000000, db2=0x10000000000001;
   
    /*
    //ch = uch;// 128 -> -128
    uch = ch;// -128 -> 128

    ch = sh; uch = sh;//0x23 , 큰변수를 대입하면 하위에서 짤림
    ch = ush; uch= ush;//
    ch=i;    uch=i;//0x45
    ch=ui;    uch=ui;

    //문제 !!!
    sh = ch; ush=ch;//주의! '부호있는 작은 크기 변수(char)'를 '부호없는 큰변수(USHORT)'에 대입할때 주의<-- 예측 힘든 상황!!
        // char 이 양수 -> 문제가 안됨,         127(0x7f) -> 127(0x7f)
        // char 이 음수(-) -> 문제가 됨!    -128(0x80) -> 65439(0xff80)
    ush = (short)ch;    //-128(0xff80)
    ush = (USHORT)ch;    //-128(0xff80)
    ush = (UCHAR)ch;    // 128(0x0080) <--!!
   
    sh = uch; ush=uch;//0x80 -> 0x0080, 부호없는 것들 끼리는 크기에 따라서도 문제 없음
    sh = i; ush=i;// 큰변수를 대입하면 하위에서 짤림 <-- 예측 가능한 상황
    sh = ui; ush=ui;

    i = ch; ui=ch;//0xffffff80
    i = ush; ui=ush;//0x00002345
    i = l; ui=l;
    i = ul; ui=ul;
    i = dw; ui=dw;
    i = fl; ui=fl2;
    i = db; ui=db2;


부동소수점
http://slame.tistory.com/2
    http://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90
    //float : 부호부1(전체부호),지수부7(부호있음), 가수부23(유효수)
    //    - 표현가능 범위 : (가수)×(밑수)^(지수), 2^(2^7)-1 =  3.4E+38 , 십의 38자리
    //    - 가수부 범위 = 23bit -> 2^23 = 0x800000
    //    - 실제 1단위로 크기비교가능한 정수 범위 : 2^24-1 = 0x1000000-1=0xffffff=(16,777,215) = 1.67772e+007, 십의 7자리까지(안전하게 6자리)

    //double : 부호부1(전체부호),지수부11(부호있음), 가수부50(유효수)
    //    - 표현가능 : 2^(2^11-1)-1 = 1.7E+308 , 십의 308자리 
    //    - 실제유효 정수 : 2^50-1 = 0x4000000000000 -1=(1,125,899,906,842,624) =1.1E+16  = 십의 15자리 까지
*/

    //fl = ch;    fl = uch;    fl = sh;    fl = ush;
    i=0x800000;        fl = i;//0x800000 (8,388,608) = 8.38861e+006
    i=0x7fffff;        fl=i;//0xffffff (16,777,215) = 1.67772e+007
    i=0x800000;        fl2 = i;//1.67772e+007
    if( fl == fl2){    i=0; }else if( fl < fl2){    i=1; }else{    i=2; }//크기구분 안됨 , 0x1000000미만 (0xffffff) 까지만 크기 구분됨

    //    12345678901234567890
    i64=0x3fffffffffffff;        db = i64;
    i64=0x40000000000000;        db2 = i64;//2^50-1 에서만 1단위 크기비교 가능
    if( db == db2){    i=0; }else if( db < db2){    i=1; }else{    i=2; }





반응형

'Code' 카테고리의 다른 글

[Tips] Program Error  (0) 2013.04.20
프로시져 시작 지점 을(를) DLL avcodec 에서 찾을 수 없습니다.  (0) 2013.03.24
SDK -> MFC 변경  (0) 2013.03.10
ffmpeg 빌드 - 미리 빌드 해 놓은 것 사용하기  (0) 2013.02.03
빅데이터  (0) 2013.01.29
Posted by codens