2018년 8월 14일 화요일

[C] 데이터타입 숫자 범위

[출처] http://mwultong.blogspot.com/2006/09/c-char-int-float-data-type-ranges.html

[정수형] 

▶ char, unsigned char          1 byte (8비트)
------------------------------------------------------
char 의 최소값: -128
char 의 최대값: 127

unsigned char 의 최소값: 0
unsigned char 의 최대값: 255 (0xff)



▶ short, unsigned short        2 bytes (16비트)
------------------------------------------------------
short 의 최소값: -32768
short 의 최대값: 32767

unsigned short 의 최소값: 0
unsigned short 의 최대값: 65535 (0xffff)


▶ wchar_t 또는 __wchar_t       2 bytes (16비트)
------------------------------------------------------
wchar_t 의 최소값: 0
wchar_t 의 최대값: 65535

※ wchar_t 는 유니코드 글자 1개를 저장합니다. "unsigned short"과 동일.



▶ int, unsigned int            4 bytes (32비트)
------------------------------------------------------
int 의 최소값: -2147483648
int 의 최대값: 2147483647

unsigned int의 최소값: 0
unsigned int의 최대값: 4294967295 (0xffffffff)



▶ long, unsigned long          4 bytes (32비트)
------------------------------------------------------
long 의 최소값: -2147483648L
long 의 최대값: 2147483647L

unsigned long 의 최소값: 0UL
unsigned long 의 최대값: 4294967295UL (0xffffffffUL)

※ 32비트OS에서의 long 은 int 와 동일



▶__int64 또는 long long        8 bytes (64비트)
------------------------------------------------------
__int64 의 최소값: -9223372036854775808i64
__int64 의 최대값: 9223372036854775807i64

unsigned __int64 의 최소값: 0ui64
unsigned __int64 의 최대값: 18446744073709551615ui64 (0xffffffffffffffffui64)


[실수형] 

▶ float                        4 bytes (32비트)
------------------------------------------------------
가장 작은 양수: 1.175494351e-38F
가장 큰 양수  : 3.402823466e+38F



▶ double                       8 bytes (64비트)
------------------------------------------------------
가장 작은 양수: 2.2250738585072014e-308
가장 큰 양수  : 1.7976931348623158e+308



▶ long double                  8 bytes (64비트)
------------------------------------------------------
double 과 같음.

[MFC] 파일입출력

[출처] http://phiru.tistory.com/138

// 읽기(바이너리로 읽기) 
// 쓰기(바이너리로 쓰기)

CFile rawData;              // 읽을 파일
CFile processData,            // 쓸 파일
CFileException proEx, rawEx;        // 예외

if(!rawData.Open(strFullPath, CFile::modeRead | CFile::typeBinary, &rawEx))  // 오류 체크
{
AfxMessageBox("rawData exception!");
rawData.Close();
return;
}

if(!processData.Open(strProData, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary, &proEx))
{
AfxMessageBox("ProcessData exception!");
processData.Close();
return;
}

UINT nRet = 0;                                // 읽은 크기
char buffer[KD_BUFFER_SIZE];        // 읽을 버퍼 싸이즈

while(1)
{
ZeroMemory(buffer, sizeof(buffer));
nRet = rawData.Read(buffer, sizeof(buffer)); // 읽기
if(nRet == sizeof(buffer))                                               // 읽을 데이터가 남아있다(확률적으로 맞지)
{
processData.Write(buffer, sizeof(buffer));        // 사실 이거 만들때는 조건이 있어서 일케 분류했다.
}
else // 파일이 끝부분일 경우(안맞을 확률 1/버퍼 싸이즈)
{
processData.Write(buffer, sizeof(buffer));
break;
}
}

// 다 읽고 썼으니깐 핸들 닫자
processData.Close();
rawData.Close();

// 파일 잘 되었는지 친절히 폴더도 열어주자
ShellExecute(NULL, "open", dataDir, NULL, NULL, SW_SHOWNORMAL);

------------------------------------------------------------------------------------------
std::fstream rawData;                    // 읽고 쓸 파일.(여기에서는 덮어쓰기한다. 요고 디지게 찾았다)
std::fstream headerData;                // 읽을 파일(이걸 읽어서 rawData에 덮는 식으로 예제를 짰다)

rawData.open(cFileFullPath, std::ios::binary | std::ios::out | std::ios::in);        // Open할때 바이너리, 읽고 쓰기로.
if(!rawData.is_open())    // 잘 열렸는지 인. 아니면 오류 났다고 해주자
{
// 현재 fstream은 unicode가 안되어서?? 잘 모르겠지만 경로에 한글 있음 안된다.
MessageBox("File Open Error.(Don't use Korean title)", "Error", 0);
printf("error\n");
rawData.close();
return;
}

headerData.open(cHeaderPath, std::ios::binary | std::ios::in);     // 바이너리로 하고 읽기로.
if(!headerData.is_open())
{
MessageBox("File Open Error.(Don't use Korean title)", "Error", 0);
printf("error\n");
headerData.close();
return;
}

char buffer[KD_BUFFER_SIZE];
memset(buffer, 0, sizeof(buffer));
headerData.read(buffer, sizeof(buffer));        // 읽기
int size = strlen(buffer);                            // 읽은 사이즈 한번 보고
rawData.write(buffer, sizeof(buffer));            // 쓴다. 덮어서!
rawData.flush();                                    // 적용!!
rawData.close();                            // 닫어
headerData.close();                        // 요곳도 닫어