변수범위 (유효자리)
* 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 |