레이블이 정수형인 게시물을 표시합니다. 모든 게시물 표시
레이블이 정수형인 게시물을 표시합니다. 모든 게시물 표시

2015년 6월 17일 수요일

싸이랩(scialb)의 숫자 자료형 (정수형과 실수형)

실수형 데이터

기본적으로 Scilab에서 숫자는 배정도 (C 언어의 double형, 8바이트) 실수형이며 단정도 (C 언어의 float형) 실수는 사용되지 않는다. Scilab뿐만 아니라 다른 수치해석 프로그램에서도 계산 결과의 정밀도가 중요하기 때문에 보통 실수는 정확도가 가장 높은  배정도 실수형으로 다룬다. 따라서 다음과 같이 입력하면 변수 x에 저장되는 수는 보기에는 정수이지만 내부적으로는 double형 실수이며 8바이트가 할당된다.
>> x = 1
이러한 배정도 실수형의 유효 자리는 보통 16자리인데 실용적인 공학 문제를 다룰 때는 대부분의 경우 크게 문제가 되지 않는다. 또한 배정도 실수형으로 다룰 수 있는 정수의 범위는 ~ 이며 이 범위 안에서의 정수 연산은 항상 정확한 값을 가진다. 그러나 이 범위 밖의 정수 연산은 오차가 발생하게 된다.
 보통은 Scilab을 작성할 때는 주로 실수형 데이터를 사용하고 정수형은 사용 빈도가 실수형에 비해서 낮지만 정수형 데이터에 대해서도 설명하도록 하겠다.

정수형 데이터

 배정도 실수 외에 정수형으로 데이터를 변환할 수 있으며 정수형을 다시 double형으로 바꿀 수도 있는데 관련된 함수는 다음과 같다.

[표 1]  숫자형의 변환에 관련된 함수들
함수
기능
double(M)
정수형 행렬 M을 배정도 실수형으로 변환
int8(A)
행렬 A를 8비트 부호 있는 정수형으로 변환
int16(A)
행렬 A를 16비트 부호 있는 정수형으로 변환
int32(A)
행렬 A를 32비트 부호 있는 정수형으로 변환
uint8(A)
행렬 A를 8비트 부호 없는 정수형으로 변환
uint16(A)
행렬 A를 16비트 부호 없는 정수형으로 변환
uint32(A)
행렬 A를 32비트 부호 없는 정수형으로 변환
iconvert(M, itype)
행렬 M을 특정한 형식으로 변환한다.
itype = 0 : 배정도 실수형
itype = 1 : int8 형, itype = 11 : uint8 형
itype = 2 : int16 형, itype = 12 : uint16 형
itype = 4 : int32 형, itype = 14 : uint32 형
inttype(M)
행렬 M의 데이터형을 반환한다. 반환값은 다음과 같다.
0 : 배정도 실수형, 1 : int8 형, 11 : uint8 형, 2: int16 형, 12 : uint16 형, 4 : int32 형, 14 : uint32 형

각 정수형의 숫자 범위는 다음과 같다.
  • 부호가 있는 n비트 정수의 범위: ~
  • 부호가 없는 n비트 정수의 범위: 0 ~

따라서 만약 정수형을 사용한다면 이 범위를 고려해서 프로그래밍을 해야 한다. 연산 결과가 이 범위를 넘어갈 경우 의도하지 않은 결과가 발생함을 다음 예에서 보이고 있다.


 만약 두 정수를 더하는데 서로 자료형이 다르다면 그 결과값은 큰 쪽의 데이터형으로 맞춰진다. 즉, 8비트 정수형과 16비트 정수형을 더하면 그 결과는 16비트 정수형이 된다. 다음 예는 그 사실을 보여주고 있다. 하지만 정수형과 실수형을 연산하면 그 결과는 정수형이 되는 것에도 유의해야 한다.

 Scilab의 정수형은 순환값을 가진다.(circular integers) 이것은 정수가 상한을 넘게되면 하한값을 가지게 되고 반대로 하한값보다 더 작아지면 상한값을 가지게 된다는 의미이다. 예를 들어 int8 형의 상한값은 127이며 여기에 1을 더하면 128이 되지 못하고 하한인 -128값을 가지게 된다. 다른 예로 uint16 의 하한 값은 부호 없는 정수이므로 0인데 여기서 1을 빼게 되면 상한인 65535 가 된다는 것이다.


이에 반해서 Matlab이나 Octave에서의 정수형은 허용범위를 넘어서면 순환하는 것이 아니라 거기에서 멈춘 값을 가진다. 즉 int8(127)+1 은 상한인 127이 되며 uint16(0)-1은 0이 된다. 만약 Scilab 코드를 Matlab이나 Octave로 이식하는 경우 혹은 그 반대의 경우 유의해야 한다.


2015년 4월 17일 금요일

C/C++의 정수형 자료형

_(1) 정수형 상수 

 표에서 분류한 것과 같이 정수형은 크게 다섯 가지(char, short, int, long, long long)의 자료형이 있으며 바이트 수가 클수록 숫자 데이터의 범위도 커지게 된다. 정수형 변수에는 정수형 상수를 저장할 수 있으며 소수점(혹은 e/E)가 없는 숫자는 정수형 상수이다.

  예를 들어 부호가 있는 int 형 변수 ia 를 숫자 0으로 초기화하려면 다음과 같이 하면 된다.

---------------------------------------------------------------------------
int ia = 0;
---------------------------------------------------------------------------

이후에는 ia라는 int형 변수를 '사용'하여 정수 값을 저장하거나 산술 연산을 수행할 수 있다. 

---------------------------------------------------------------------------
int ia = 0;
ia = 34*567; // *는 곱셈 연산자임
---------------------------------------------------------------------------

  정수형 상수는 기본적으로 int형으로 간주되므로 저장하는데 내부적으로 4 byte(혹은 2 byte)가 소요가 된다. 만약 숫자 상수를 특정한 자료형으로 지정해 주고 싶다면 접미어를 붙여서 그 데이터형을 지정할 수 있는데 U(혹은 u)를 붙이면 unsigned int형이고 l(혹은 L)은 long형, ul(혹은 UL)은 unsigned long형임을 나타낸다.



접미어
자료형
예제
u/U
unsigned int
37u, 123U
l/L
long
12l, 12L
ul/UL
unsigned long
89ul, 89UL

--------------------------------------------------------------------------
unsigned int uia = 0u;
unsigned long ula = 123ul;
---------------------------------------------------------------------------

하지만 보통은 숫자 상수는 대입하려는 변수의 자료형에 자동으로 변환되어 저장되므로 굳이 이렇게 일일이 자료형에 맞추어 접미어를 붙여줄 필요는 없다. 즉,

---------------------------------------------------------------------------
unsigned long ula = 123; 
---------------------------------------------------------------------------

이라고 초기화하여도 123이라는 int형 상수는 자동으로 unsigned long 형으로 변환된 후 변수 ula에 저장된다.

  만약 숫자상수를 short 형이나 unsigned char 형으로 지정하고 싶다면 다음과 같이 해야 한다.

---------------------------------------------------------------------------
short sa = (short)1; 
unsigned char uca = (unsigned char)123;
---------------------------------------------------------------------------

이와 같이 숫자 상수 앞에 (자료형) 을 붙여기 자료형을 강제로 변환하는 것을 형변환(casting)이라고 한다. 하지만 이 경우도 아래와 같이 할 수 있다. 자동으로 형변환이 일어나기 때문이다.

---------------------------------------------------------------------------
short sa = 1; 
unsigned char uca = 123;
---------------------------------------------------------------------------

  한 가지 알아두어야 할 사실은 C/C++언어에서 정수를 표현할 때 0으로 시작되는숫자는 8진수이고, 0x로 시작하는 숫자는 16진수라는 것이다. 예를 들어서 123은 그냥 10진수 123이지만 0123 이라고 입력하면 8진수 123이기 때문에 10진수로 변환하면 83이다. 그리고 0x123은 16진수 123이기 때문에 10진수로 변환하면 291이 된다. 이것을 다음 표에 정리하였다.



숫자 상수
십진수값
비고
123
123
10진수
0123
83
8진수
0x123
291
16진수
0b1110
14
2진수(gcc에서 지원, C++14)

(2) 문자 상수

  C/C++ 언어에서는 정수형 변수에 정수뿐만 아니라 문자를 저장할 수 있으며 특별히 char형과 int형은 문자를 저장하는 목적으로도 자주 사용된다. 문자상수는 작은 따옴표(‘’)를 이용하여 표현되며 예를 들면 ‘a’, ‘+’, ‘0’ 등이 있다. 문자상수는 아스키(ASCII)코드라는 고유의 상수값이 정해져 있는데 다음 표에 몇몇 문자상수와 아스키코드값을 수록하였다.



종류
문자와 ASCII 코드
숫자 (문자)
ASCII 코드
‘0’
48
‘1’
49
‘2’
50
‘9’
57
알파벳 대문자
ASCII 코드
‘A’
65
‘B’
66
‘C’
67
...
‘Z’
90
알파벳 소문자
ASCII 코드
‘a’
97
‘b’
98
‘c’
99
...
‘z’
112
특수문자
ASCII 코드
‘&’
38
‘*’
42
‘+’
43



  char형은 크기가 1바이트이므로 부호 없는 unsigned char 변수인 경우 0부터 255까지의 작은 숫자를 저장할 수 있으며 short형은 2바이트로 부호 없는 숫자의 경우 0부터 65,535까지 저장할 수 있다. 만약 char형 변에 문자상수, 예를 들어서 ‘a’가 저장되면 내부적으로는 97이라는 숫자가 저장된다는 것을 알아야 한다.



bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
‘a’ (97)
0
1
1
0
0
0
0
1
  부호가 있는 정수형 데이터는 음수를 2의 보수로 저장하기 때문에 저장범위가 char형은 –128~+127이 되고 short형은 –32,768~+32,767이 된다.
[#00008]

C/C++의 자료형과 변수


 자료형(data type)이란 정수, 실수, 문자 등과 같이 프로그램에서 사용되는 데이터의 종류를 의미한다. 사용하고자 하는 데이터의 종류가 정해지면 그것을 저장할 변수는 그것에 맞추어서 만들어져야 한다.

 일반적으로 프로그래밍 언어에서는 기본적인 자료형을 제공하고 사용자들이 필요에 따라 새로운 자료형을 정의할 수 있는 방법을 제공하고 있다. 표준 C/C++언어에서 제공하는 기본적인 자료형을 다음 표에 정리하였다.

[표]  기본 자료형

분류
데이터형
byte
범위
비고
정수형
(signed) char
unsigned char
1
-128~ 127
0~255

(signed) short
unsigned short
2
-32,768 ~ 32,767
0 ~ 65,535

(signed) int

unsigned int
4/2
-2,147,483,648 ~
     +2,147,483,647
0~4,294,967,295

(signed) long

unsigned long
4
-2,147,483,648 ~
     +2,147,483,647
0~4,294,967,295

(signed) long long
unsigned long long
8
-2^63 ~ 2^63-1
0 ~ 2^64-1
C99
C99
실수형
float
4


double
8


long double
12

C99
논리형
bool
boolean
1
1
true,false
C99
C++

 C/C++ 자료형은 크게 정수형과 실수형, 논리형으로 나뉜다. 정수형은 부호가 있는 signed 형과 부호가 없는 unsigned 형이 별개로 존재하지만 실수형은 그렇지 않다. 또한 각각의 자료형은 정해진 크기가 있으나 PC환경에 따라 그 크기가 변화하는 데이터 형이 있음에 주의해야 한다. (대표적인 것이 int형과 long double형이다.)

 논리형은 true, false 두 가지 값만을 가지는 자료형이다. C 언어에서는 C99이후에 stdbool.h 라는 표준 헤더 파일을 인클루드하면 bool형을 사용할 수 있다. C++은 boolean 자료형이 기본으로 제공된다.

 변수는 자료를 담는 그릇이다. 변수를 사용하려면 반드시 먼저 선언을 해야 하며 문법은 다음과 같다.

   자료형 변수명;

예를 들어서 int 형 변수 ia를 사용하려면 다음과 같이 선언을 해야 한다.

   int ia;

이렇게 선언을 한 이후에는 이 변수에 값을 대입한다든지 계산을 하는데 사용할 수 있다.

int ia; // 선언
ia = 100; //사용(초기화) 정수값을 대입
ia = 12*345; //사용 :곱셈 계산

 변수의 '초기화'는 선언된 이후에 맨 처음으로 어떤 값을 대입하는 것을 의미한다. 위와 같이 변수를 선언한 후 초기화를 별도로 할 수도 있고 선언과 동시에 초기화를 수행할 수 도 있다.

long la = 0; // 선언과 동시에 초기화
double da = 1.0; // 선언과 동시에 초기화

이렇게 한 이후에는 자유롭게 변수를 사용할 수 있다.