'내 이야기'에 해당되는 글 367건

  1. 2008.06.06 자료
  2. 2008.05.29 Call By [Value, Pointer, Reference]
  3. 2008.05.28 int값 입력받아서, 비트값 출력하기(재귀함수)
  4. 2008.05.28 비트검사
  5. 2008.05.28 비트 연산
  6. 2008.05.28 배열의 이름과 주소값
  7. 2008.05.28 예약 영역 vs 미예약영역
  8. 2008.05.27 Lvalue / Rvalue
  9. 2008.05.27 부동소수점
  10. 2008.05.26 IEEE745
분류없음2008.06.06 16:21
ㅇㅇㅇㅇ
Posted by 네떡지기
프로그래밍/C/C++2008.05.29 12:14

void Call_By_Reference(int &n)
{
 n++;
 return;
}

void Call_By_Value(int n)
{
 n++;
 return;
}

void Call_By_Pointer(int *n)
{
 (*n)++;
 return;
}

int main()
{
 int a=0;
 Call_By_Value(a);
 printf("%d\n",a);
 Call_By_Reference(a);
 printf("%d\n",a);
 Call_By_Pointer(&a);
 printf("%d\n",a);

=================================
0                          
1
2

Posted by 네떡지기
프로그래밍/기타2008.05.28 16:21

void bitCheck(int input,int check) // 입력 숫자 , 비트 자리수
{
 int checkBit=1;
 if(check<31)
  bitCheck(input,++check);
 
 for(int i=1;i<check;i++)
 {
   checkBit = checkBit*2;
 }

 if(checkBit&input)
  printf("%c",'1');
 else
  printf("%c",'0');

}

int main()
{
 int input;
 int scanfCheck=0;
  while(1)
 {
  printf("정수를 입력하시오 : ");
  scanfCheck = scanf("%d",&input);
  //printf("12345678901234567890123456789012\n");
  if(!scanfCheck)
   break;
 
  bitCheck(input,0);
  printf("\n");
 
 }

 return 0;
}

Posted by 네떡지기
프로그래밍/기타2008.05.28 16:03

int main()
{
 int a= 0x3a7d;
 int input;
 int zeroOne;
 int check=1;
 int scanfCheck=0;
 while(1)
 {
  printf("a변수의 몇 승 bit를 검사할까요? : ");
  scanfCheck = scanf("%d",&input);
  if(!scanfCheck)
   break;

  for(int i=1;i<=input;i++)
  {
   check = check*2;
  }

  if(check&a) // 1일 경우
   zeroOne=1;
  else
   zeroOne=0;
   
  printf("a변수의 %d승 %d입니다.\n",input,zeroOne);  
 }

 return 0;
}


Posted by 네떡지기
프로그래밍/기타2008.05.28 14:45
 char a=0xff, res;
 res = a >> 3;
 printf("%#x\n",res);
 
 unsigned char b=0xff, res1;
 res1 = b>>3;
 printf("%#x\n",res1);

0xffffffff  : signed는 sign bit로 채움.
0x1f      : unsigned는 0으로 채움.


printf 할 때 프린트버퍼에 먼저 들어가는 데, 4바이트 단위로 들어감.
1바이트 char를 넘길 때, 확장해서 넘김.
unsigned가 들어 갈 때, 확장 시 0으로 확장해서 0000001f 이므로 ,1f만 찍힘.

signed일 경우에는 sign bit로 확장. ffffff가 확장됨.
Posted by 네떡지기
프로그래밍/기타2008.05.28 14:25
 char* arr[10];
 printf("arr: %p      &arr : %p\n",arr,&arr);


arr: 0012FF58      &arr : 0012FF58

배열의 이름 값은 주소이며, 배열의 이름값의 &는 동일한 주소값을 가리키며, 단지 차원을 높이는 역할만 함.
Posted by 네떡지기
프로그래밍/기타2008.05.28 10:40
1:  int arr[3]={1,2,3};
2:  printf("%d\n",arr[3]);
3:  arr[3] = 5;

arr[0]~arr[2] : 예약영역
기타 미 예약 영역

예약영역    :  쓰기 및 읽기 가능
미예약영역 :  쓰기 불가, 읽기 가능

2번까지는 출력(쓰레기 값)
3번은 런타임에러 : 미예약영역에 쓰기 시도
Posted by 네떡지기
프로그래밍/기타2008.05.27 16:59
Lvalue에는 변수만 가능
Rvalue에는 변수 및 상수 모두 가능.

Lv = Rv
1. type
2. 차원
  이 동일해야함.

일반상수는 무조건 0차원
주소상수는 최소 1차원 이상

차원조절 연산자
* [] & (type) ->


int main(int argc, char* argv[])
{
 char ch3[2];
 ch3="a";
 return 0;
}

에러.
ch3는 배열의 주소값.
배열의 주소값은 "주소상수"임
Lvalue 에는 상수가 안 됨.

Posted by 네떡지기
프로그래밍/기타2008.05.27 11:10
  1 #include <stdio.h>
  2 int main(void)
  3 {
  4         printf("%x : %x \n", 1.0);
  5         printf("%x : %x \n",0.0);
  6         printf("%d \n",3.0);
  7 }

 결과 값 :
 0:3ff00000
 0:0
 0


3 -> 2진수 : 11.0(2)  정규화 : 1.1 *2^1




프린트 버퍼의 특성상 float도 프린터버퍼로 들어가면 double로 변환되서 들어감.(실수)
char(1바이트)를 넣을 때는 4바이트로(int)로 캐스팅되서 들어감.

프린트 버퍼는 4바이트씩 읽어감.


#include <stdio.h> 시스템 표준 헤더파일
#include "plming.h" 사용자 헤더파일. 현재 위치 기준
Posted by 네떡지기
프로그래밍/기타2008.05.26 22:48

int형과 float형은 둘 다 4바이트로 자료형의 크기가 같은데 실제로 표현될 수 있는 값은 왜 그렇게 큰 차이가 나는 것일까?

int, float 자료형의 bit구조를 알기전까지는 위와 같은 의문을 가진바가 있었다.

그 의문은 컴퓨터구조라는 과목을 배우면서 해결되었다.

더불어, 부동소수점 형이 의외로 신뢰할 수 없는 결과를 나을 수 있다는 것도..


int 형     -2,147,483,648  ~  2,147,483,647     ( 2-31 ~ 231-1 )

float형   3.4E-38 ~ 3.4E+38                   ( 3.4*10-38 ~ 3.4*1038 )


int형이 42억 남짓한 수를 표현할 수 있는 반면,

float형은 무려 0 이 38개나 붙는 어마어마한 수를 표현할 수 있다.

     ( 조 단위까지 가더라도 0 은 고작 12개일 뿐이다. )


위에서도 언급했다시피 똑같은 4바이트(32비트)로 표현가능한 수의 범위가 차이나는 이유는 무엇일까?

그 이유는 두 자료형을 구성하는 비트 구조가 다른데서 기인한다.


int형은 구조가 단순하다.

4바이트를 비트형태로 보면 아래와 같다.


 31  30 29 28 27 .......                                                     .........2  1  0 bit

1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1


int형의 범위는 아래와 같이 구해진다.


    (1*231) + (1*230) + (1*229) + ...... + (1*21) + (1*20)


이와 같이 이진수 <-> 십진수 변환법과 똑기에 2-31 ~ 231-1 까지 표현가능하다.


하지만 float형은 다르다.


 31 30 29 28 .. 25 24 23  22 21 20 ......                                   .........2  1  0 bit

1

1 1 1 1 1 1 1 1 

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

부호   지수비트(8bit)                           유효자리비트(23bit)

비트


float 형의 범위는 아래와 같이 구해진다.


    (-1)부호비트 * (1 + 유효자리) * 2(지수-127)


부호비트 - 부호를 결정하는 비트

유효자리 - 소수점 이하의 수를 표현

지 수     - 2n 에서 n을 표현


부호비트(1bit) + 지수(8bit) + 유효자리(23bit)로 구성되어 있고, 이와같이 숫자를 표현하는 비트구조 자체가 서로 차이를 보임으로 인해 int형과 float형은 4byte 의 크기를 지니더라도 실제 표현가능한 값에는 상당한 차이가 있음을 알았다.

부동소수점에 대해 조금 더 알아보자.

더 큰 수를 표현할 수 있다고 해서 float형이 더 좋은 것일까?   그것은 아니다.

분명히 단점도 존재한다. 그것은 이전 글에서 언급한 정밀도의 한계를 가진다는 것이다.

int형은 있는 그대로의 비트를 보여주면 되기 때문에 100%의 정확도를 가지며, 그에 비해 float형은 아주 큰 수를 표현할 수 있지만 그 수가 유효자리비트로 표현할 수 있는 한계를 넘어가버리게 되면 근사치를 취하게 된다. 실제로 값을 짤라먹는다는 말이다.

컴퓨터의 계산은 100% 믿을 수 있어야 하는데 이처럼 그 값을 제대로 표현하지 못하게 되면 어찌 될까.

아주 큰 수에서 이러한 경우가 발생하기 때문에 보통은 신경 쓰지 않아도 되지만 그것조차 고려를 해야한다면

해결 방법으로는 double 형을 쓰는 것이 있다.


double         1.7E-308 ~ 1.7E+308         ( 1.7*10-308 ~ 1.7*10308 )

long double    3.4E-4932 ~ 3.4E+4932         ( 3.4*10-4932 ~ 1.7*104932 )


 31  30 29 28 .......       22 21 20   19 18 17 ....                        ......   2  1  0 bit

1

1 1 1 1 1 1 1 1 1 1 1

 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

부호   지수비트(11bit)                           유효자리비트(20bit)

비트


1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

                           유효자리비트(30bit)


double형은 8바이트(64비트)로 표현하기 때문에 float보다 훨씬 크며, 유효자리비트 또한 커서 정밀도 역시 높아지게 된다. 그렇다면 많은 비트를 할당해서 더 큰 수와 더 정확한 정밀도를 제공한다고 해서 float형에서 발생했던 오류가 사라지는 것인가?


아니다.  여전히 존재한다.  단지, 그러한 경우가 발생할 확률이 줄어들도록 더욱 더 많은 비트를 할당 할 뿐...


다만, 이러한 경우가 발생할 것을 예측하여, 프로그래머가 예방하는 길만이 최선의 방법일 것이다.

알아두자. 아주 크거나 아주 작은 부동소수점 수는 무조건 믿으면 안된다는 것을...

지금까지 언급한 내용은 IEEE745 표준에서 나온 것으로 부동소수점 연산을 하는 기계에서 다루어지는 부분이다.

 float, double, long double 의 값들은 특정한 기계에 대한 것이며 기계에 따라 다를 수 있다. < C++을 이용한 프로그래밍, 사이텍미디어 >

Posted by 네떡지기

티스토리 툴바