C 언어 기사 - 메모리에 데이터 저장

이 장의 학습 포인트

1. 데이터 유형의 자세한 소개
2. 메모리에 쉐이핑 저장: 원본 코드, 역 코드, 보완 코드
3. 빅 앤 스몰 엔디안 바이트 순서의 소개 및 판단


문자가 시작됩니다! ! !

데이터 유형에는 다음이 포함됩니다.

주요 소개: 부동 소수점 유형, 열거 유형, 포인터 유형, 기타는 나중에 장에서 자세히 소개합니다.

부동 소수점 계열:

멤버: float, double

참고 : 부동 소수점 숫자는 등호로 직접 동일하다고 판단할 수 없으며 ESP(정밀도)를 설정해야 합니다.

예를 들어, double 유형의 변수가 0인지 여부를 판별하기 위해 직접 a==0일 수 없습니다.

#include<stdio.h>
#include<math.h>
#define ESP 0.000000000000000001
int main()
{
	double a = 0.0000000001;
	if (fabs(a) < ESP)
	{
		printf("a等于0");
	}
	return 0;
}

 입력 10진수가 리터럴 값의 2배 형식을 나타내는 경우 float 형식 10진수를 입력해야 하는 경우 소수점 뒤에 f를 넣어야 합니다.

 경고에 대한 해결 방법: float a = 0.2f.

열거형

정의

열거 형 정의는 다음 형식의 enum 키워드로 식별됩니다.

enum 标识符 
{
      枚举数据表
};

알아채다:

(1) 열거형은 열거형을 식별하는 키워드입니다. 열거형 정의는 열거형으로 시작해야 합니다.

(2) 열거형 데이터 테이블의 이름은 프로그래머가 설정한 것으로, 이러한 이름은 기호일 뿐입니다. 그러나 프로그램의 가독성을 높이려면 이름에 주의하십시오. 열거형은 컬렉션이고 컬렉션의 요소(열거형 멤버)는 명명된 정수 상수이며 요소는 쉼표로 구분됩니다.

(3) 열거 데이터 테이블의 값은 모두 정수입니다. 첫 번째 열거형 멤버의 기본값은 0의 정수이고 후속 열거형 멤버의 값은 이전 멤버에 대해 1씩 증가합니다. 열거형 멤버의 값을 수동으로 설정하여 특정 범위의 정수를 사용자 지정할 수도 있습니다.

(4) 열거형 상수는 타입이 정의될 때 초기화될 수 있다.

(5) 열거형을 비교할 수 있습니다.

(6) 열거형 상수는 문자열이 아니며, 문자열은 %s 모드에서 출력할 수 없습니다.

(7) 열거형은 전처리 지시어 #define의 대안입니다.

포인터 유형

여기서는 주로 null 포인터 void*를 소개합니다.

다음 두 가지 사항을 기억하십시오.

1.void*는 모든 유형의 포인터를 허용할 수 있습니다.

2. 모든 유형의 포인터는 void를 허용할 수 있습니다.

모양의 메모리 내 저장

우리가 알아야 할 것은 데이터가 보완으로 메모리에 저장된다는 것입니다!

우리는 먼저 다음 지식을 이해해야 합니다

원본 코드
는 양수 및 음수 형태의 이진법으로 직접 변환될 수 있습니다.
1의 보수
원본 코드의 부호 비트는 변경되지 않고 나머지 비트는 다른 비트를 차례로 반전하여 얻을 수 있습니다.
보어

보수를 얻으려면 +1을 보완하십시오.

-1과 같은 숫자

원래 코드: 1000 0000 0000 0000 0000 0000 0000 0001

보완: 1111 1111 1111 1111 1111 1111 1111 1110

보완: 1111 1111 1111 1111 1111 1111 1111 1111

-1의 보수는 32개임을 기억하는 것이 좋습니다.
보완을 저장하는 이유는 무엇입니까?

CPU는 덧셈 연산( 실제로는 보수 덧셈 )만 수행하고 뺄셈 연산은 수행할 수 없으며 보수 코드는 이 문제를 아주 잘 해결할 수 있습니다.

예를 들어, 1-1은 1+(-1)로 변환될 수 있습니다.

1의 보수는 원래 코드와 같습니다: 0000 0000 0000 0000 0000 0000 0000 0001

-1의 보수는 다음과 같습니다. 1111 1111 1111 1111 1111 1111 1111 1111
을 더한 값은 0000 0000 0000 0000 0000 0000 0000 0000입니다 .

결과는 2의 보수의 마술인 0입니다! !

크고 작은 소개

빅 엔디안(저장) 모드는 데이터의 하위 비트가 메모리의 상위 주소에 저장되고 데이터의 상위 비트가 메모리의 하위 주소에 저장됨을 의미합니다.
리틀 엔디안(저장) 모드는 데이터의 하위 비트가 메모리의 하위 주소에 저장되고 데이터의 상위 비트가 메모리의 상위 주소에 저장됨을 의미합니다.

데이터의 로우 엔디안: 바이트 단위로 오른쪽으로 갈수록 가중치가 낮아집니다.

데이터의 상위 바이트 순서: 바이트 단위로 가중치가 높을수록 왼쪽에 가깝습니다.

데이터 int a = 0x11 22 33 44와 같은 

44가 가장 낮은 가중치를 가지며 33이 그 뒤를 잇습니다. 이것은 정수 1234와 같으며 1의 가중치는 10의 3승이고 2의 가중치는 10의 2승입니다. 1은 높은 전체 값 비트이고 4는 낮은 가중치 비트입니다.

vs2019로 테스트한 컴파일러는 높은 주소에 높은 비트를 배치하고 낮은 주소에 낮은 비트를 배치합니다. 즉, vs2019는 리틀 엔디안 스토리지를 사용합니다.

다음으로 메모리를 보고 특정 환경에서 사용되는 데이터 저장 방식(리틀 엔디안 또는 빅 엔디안)을 판단하지 않는 프로그램을 설계합니다.

#include<stdio.h>
int check_sys()
{
	union
	{
		int i;
		char c;
	}un;
	un.i = 1;
	return un.c;
}
int main()
{
	int a = check_sys();
	if (a == 1)
	{
		printf("小端");
	}
	else
	{
		printf("大端");
	}
	return 0;
}

마침내

이 장에 대해 질문이 있으면 언제든지 저에게 연락하십시오.

이 장에 오류가 있으면 지적해 주시면 대단히 감사하겠습니다.

도움이 되셨다면 좋아요와 댓글 부탁드립니다.

추천

출처blog.csdn.net/m0_62171658/article/details/123118034