데이터 저장 및 관련 일반적인 예에는 메모리의 부동 소수점 숫자 저장에 대한 자세한 설명이 포함됩니다.

데이터 저장 예

예1

#include <stdio.h>
int main()
{
    
    
	int a = -20;
	unsigned int b = 10;
	printf("%d", a + b);
	return 0;
}

-20은 a에 저장되고, 보수 코드에 저장됩니다. 왜냐하면 a의 값은 여전히 ​​4바이트이고 인쇄시 %d의 형태로 인쇄되어야 하므로 그 여백을 인쇄해야 하므로 최종적으로 -10으로 계산할 수 있다. 인쇄의 경우 %u는 양수로 간주됩니다. 즉, 원래 코드는 보완 코드이며 매우 큰 숫자를 인쇄합니다.

예 2

#include <windows.h>
int main()
{
    
    
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
    
    
		printf("%u\n", i);
		Sleep(1000);

	}
	return 0;
}

i는 unsigned int 유형이므로 i가 음수일 때 여백은 여전히 ​​저장되고 여백은 i에 저장됩니다
. i의 각도, 저장된 값은 모두 1이다. %u로 출력하면 모두 1이 출력되지만, %d로 출력되면 보수 부호는 원래 부호로 변환되어 -1이 출력된다. 출력되나 i>0 판정조건일때 i는 여전히 0에 비해 매우 큰 수이고 i는 항상 0보다 크므로 무한루프가 된다.

예 3

int main()
{
    
    
char a[1000];
int i;
for(i=0; i<1000; i++)
{
    
    
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}

char형의 범위는 -128~127이므로
-1부터 점차적으로 배열 a에 저장되고 -128까지 저장되면 i++는 127이 되고 점차 0으로 감소하게 되며 끝 기호는 문자열의 '\ 0', 아스키 값은 0, 즉 0을 만나면 총 255개의 숫자가 출력되고 255가 출력된다.

예 4

#include <stdio.h>
unsigned char i = 0;
int main()
{
    
    
for(i = 0;i<=255;i++)
{
    
    
printf("hello world\n");
}
return 0;
}

i의 범위는 0~255이며, i에 256이 저장되면 차단 후 8자리가 모두 0이 되므로 무한루프가 된다.

메모리에 부동 소수점 숫자 저장

부동 소수점 숫자는 정수처럼 저장되지 않습니다. 특별한 저장 방법이 있습니다.
모든 부동 소수점 숫자 V는 다음과 같은 방법으로 쓸 수 있습니다 .
(-1)^S * M * 2 ^E
. S가 0일 때 V는 양수이고 S는 1일 때 V는 음수, M은 유효수, E는 지수를 나타낸다
예를 들어 5.5는 (-1)^0 * 1.011 * 2 ^2
부호 비트 S 로 쓸 수 있다. : 0
유효숫자 M: 1.011
지수비트 E: 2
For float형은 32비트로 구성되어 있으며 1비트는 부호비트, 8비트는 지수비트, 나머지 23비트는 유효한 숫자이다. , 64비트가 있으며
1비트는 부호비트, 11비트는 지수비트, 나머지 52비트는 유효숫자
S비트는 0 또는 1을 저장하며 양수 또는 음수를 의미 E인덱스 비트 지수만 저장 M은 1.xxxxxx로 쓸 수 있으므로 소수점 이하의 숫자가 저장되어 그 때 출력됨
누락된 값은 자동으로 채워지
지만 일부 부동 소수점 숫자는 정확하게 저장되지 않음 예를 들어 , 5.3을 float형으로 저장하면 저장되는 값은 5.30000019인데, 5.3에서 소수점 이하 3은 항상 2진수로 변환되기 때문이다. 23비트이므로 오류가 있을 수 있습니다.
지수 E를 저장하기 위해 E는 무부호 정수입니다.float
유형 E의 경우 값 범위는 0~255입니다.double 유형 E의 경우 값 범위는 0~입니다. 2^11 - 1인데 0.5가 저장되면 (-1)^0 1.0
(2^-1) 로 변환되어 E가 -1이 되므로 8자리 E의 경우 E에 저장된 실제 값 중간 숫자 127을 더해야 합니다. 11자리 E의 경우 E의 실제 값에 1023을 더해야 합니다. 지수 E를 빼려면 세 가지 경우가 있습니다.

1. E가 모두 0이 아니거나 1이 아니다 1.
E의 값에서 127 또는 1023을 빼서 실수 지수를 구한다 2.
E가 모두 0일 때 +/-1.xxxxx 2^-127
을 의미하며 , 이는 경향이 있다. 이때 우리는 E를 1-127(1-1023)로 직접 분석하고 M은 0.xxxx
3으로 복원합니다. E가 모두 1일 때
+/- 1.xxxxxx 2^128을 의미합니다 . 매우 큰 숫자입니다

부동 소수점 메모리 스토리지의 일반적인 예

int main()
{
    
    
int n = 9;
float *pFloat = (float *)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
*pFloat = 9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
return 0;
}

플라스틱 관점에서 9번을 저장하고 원래의 역보완 부호는 0000000000000000000000000001001
float형 관점에서 빼면 S:-1, M:000000000000000000001001, E:00000000이므로 지수는 바로 1-127로 복원된다. , M은 0.0000000 0000000000001001이므로 9,0.000000이 출력됩니다.
부동 소수점 수의 관점에서 n에 9.0을 저장하려면 9를 (-1)^0 1.001 2 ^3으로 변환하여 메모리에 저장하면 0
00000011 0010000000000000000 입니다. 0000 .
빼면 아주 큰 숫자입니다
. float 형 관점에서 빼서 다시 복원하면 (-1)^0 1.001 2 ^3 출력값은 9.000000 입니다.

Supongo que te gusta

Origin blog.csdn.net/wan__xia/article/details/129174264
Recomendado
Clasificación