C 언어에서의 형변환: 암시적 변환과 명시적 변환

⚡ 스마트 요약

C 언어에서 형변환은 하나의 데이터 형식을 다른 데이터 형식으로 변환하는 작업입니다. 이는 컴파일러가 자동으로 더 작고 호환 가능한 형식으로 형변환하는 암묵적 형변환과, 프로그래머가 형변환 연산자를 사용하여 정밀도를 제어하고 예상치 못한 결과를 방지하기 위해 강제로 변환하는 명시적 형변환으로 나뉩니다.

  • 🔄 두 가지 형태: 암시적 형변환은 자동으로 실행되며, 명시적 형변환은 형변환 연산자를 사용하여 작성합니다.
  • 프로모션 유형: 더 작은 데이터 유형을 더 크고 호환 가능한 유형으로 변환할 때(예: short를 int로 변환) 값은 그대로 유지됩니다.
  • ✂️ 데이터 손실 위험: float를 int로 변환하는 것과 같은 축소 형변환은 소수 부분을 없애고 의미를 잃게 만듭니다.
  • 🎯 명시적 구문: (형식 이름) 표현식을 작성하면 정수 피연산자를 부동 소수점으로 캐스팅하는 것과 같이 변환이 강제됩니다.
  • 🤖 AI 지원: AI 비서와 GitHub Copilot은 캐스팅 표현을 작성하고 위험한 전환 축소를 표시합니다.

C 언어에서의 타입 캐스팅

C에서 타입 캐스팅이란 무엇입니까?

타입캐스팅은 한 데이터 유형을 다른 데이터 유형으로 변환하는 것입니다. C 언어에서는 데이터 변환 또는 유형 변환이라고도 합니다. 'C' 프로그래밍에 도입된 중요한 개념 중 하나입니다.

'C' 프로그래밍은 두 가지 유형의 형 변환 연산을 제공합니다.

  • 암시 적 유형 캐스팅
  • 명시적 유형 캐스팅

암시 적 유형 캐스팅

암시적 형변환이란 원래의 의미를 잃지 않고 데이터 형식을 변환하는 것을 의미합니다. 이러한 유형의 형변환은 저장된 값의 의미를 변경하지 않고 데이터 형식을 변경하려는 경우에 필수적입니다. 변수.

C에서 암시적 유형 변환은 값이 호환되는 데이터 유형으로 복사될 때 자동으로 발생합니다. 변환하는 동안 엄격한 유형 변환 규칙이 적용됩니다. 피연산자가 두 개의 다른 데이터 유형인 경우, 낮은 데이터 유형의 피연산자는 자동으로 높은 데이터 유형으로 변환됩니다. 이러한 유형의 유형 변환은 다음 예에서 볼 수 있습니다.

#include<stdio.h>
int main(){
	short a=10; //initializing variable of short data type
	int b; //declaring int variable
	b=a; //implicit type casting
	printf("%d\n",a);
	printf("%d\n",b);
}

출력:

10
10

암시 적 유형 캐스팅

  1. 주어진 예에서는 값이 10으로 초기화된 짧은 데이터 유형의 변수를 선언했습니다.
  2. 두 번째 줄에서는 int 데이터 유형의 변수를 선언했습니다.
  3. 세 번째 줄에서는 변수 s의 값을 변수 a에 할당했습니다. 세 번째 줄에서는 short 데이터 유형인 변수 s의 값이 int 데이터 유형인 변수 a에 복사되면서 암시적 유형 변환이 수행됩니다.

문자를 Int로 변환

ASCII로 디코딩된 문자를 정수와 함께 추가하는 예를 생각해 보세요.

#include <stdio.h>
main() {
   int  number = 1;
   char character = 'k'; /*ASCII value is 107 */
   int sum;
   sum = number + character;
   printf("Value of sum : %d\n", sum );
}

출력:

 Value of sum : 108

여기에서 컴파일러는 실제 덧셈 연산을 수행하기 전에 'k' 값을 ASCII로 변환하여 정수 승격을 수행했습니다.

산술 변환 계층

컴파일러는 먼저 문자를 정수로 승격합니다. 피연산자가 여전히 다른 데이터 유형을 가지고 있는 경우 다음 계층 차트에 나타나는 가장 높은 데이터 유형으로 변환됩니다.

산술 변환 계층

이 개념을 이해하기 위해 다음 예를 살펴보겠습니다.

#include <stdio.h>
main() {
   int  num = 13;
   char c = 'k'; /* ASCII value is 107 */
   float sum;
   sum = num + c;
   printf("sum = %f\n", sum );}

출력:

 sum = 120.000000

우선, 변수 c는 정수로 변환되지만, 컴파일러는 num과 c를 "float"로 변환하여 더한 후 최종적으로 "float" 결과를 생성합니다.

암시적 변환에 대한 중요 사항

  • 암시적 유형 변환을 표준 유형 변환이라고도 합니다. 암시적 유형 캐스팅에는 키워드나 특수 명령문이 필요하지 않습니다.
  • 더 작은 데이터 형식을 더 큰 데이터 형식으로 변환하는 것을 형식 승격이라고 합니다. 위 예시에서 s의 값은 정수형으로 승격되었다고 할 수 있습니다.
  • 암시적 유형 변환은 항상 호환되는 데이터 유형에서 발생합니다.

다음과 같이 서로 호환되지 않는 데이터 유형에 대해서는 암시적 유형 캐스팅을 수행할 수 없습니다.

  1. float를 int로 변환하면 분수 부분이 잘려 값의 의미가 손실됩니다.
  2. double을 float로 변환하면 숫자가 반올림됩니다.
  3. long int를 int로 변환하면 오류가 발생합니다.ping 과잉 고차 비트.

위의 모든 경우에 데이터 유형을 변환하면 값의 의미가 사라집니다. 일반적으로 값의 의미가 손실되면 컴파일러에서 경고합니다.

'C' 프로그래밍 명시적 유형 캐스팅인 또 다른 유형 캐스팅 방법을 제공합니다.

명시적 유형 캐스팅

암묵적 유형 변환에서 데이터 유형은 자동으로 변환됩니다. 강제로 유형 변환을 해야 할 수 있는 몇 가지 시나리오가 있습니다. int 데이터 유형으로 선언된 두 피연산자의 나누기를 저장하는 변수 div가 있다고 가정합니다.

 int result, var1=10, var2=3;
result=var1/var2;

이 경우, 변수 var1과 var2에서 수행된 나누기 후에 변수 "result"에 저장된 결과는 정수 형식이 됩니다. 이런 일이 발생할 때마다 변수 "result"에 저장된 값은 일반적으로 두 수의 나누기에서 얻어지는 분수 부분을 고려하지 않기 때문에 의미를 잃습니다.

이러한 상황에서 유형 변환을 강제하기 위해 명시적 유형 캐스팅을 사용합니다.

유형 캐스팅 연산자가 필요합니다. 유형 캐스팅 연산의 일반 구문은 다음과 같습니다.

(type-name) expression

여기

  • 유형 이름은 표준 'C' 언어 데이터 유형입니다.
  • 표현식은 상수, 변수 또는 실제 표현식일 수 있습니다.

명시적인 유형 캐스팅을 사용하여 C에서 유형 캐스팅하는 방법을 보여주는 프로그램을 작성해 보겠습니다.

#include<stdio.h>
int main()
{
	float a = 1.2;
	//int b  = a; //Compiler will throw an error for this
	int b = (int)a + 1;
	printf("Value of a is %f\n", a);
	printf("Value of b is %d\n",b);
	return 0;
}

출력:

Value of a is 1.200000
Value of b is 2

명시적 유형 캐스팅

  1. float 유형의 변수 'a'를 초기화했습니다.
  2. 다음으로, 정수형 데이터 타입의 변수 'b'가 있습니다. 변수 'a'와 'b'는 데이터 타입이 다르기 때문에 'C' 언어는 이러한 표현식을 허용하지 않고 오류를 발생시킵니다. 일부 'C' 버전에서는 표현식이 평가되기는 하지만 원하는 결과가 나오지 않을 수 있습니다.
  3. 이러한 상황을 방지하기 위해 float 유형의 변수 'a'를 유형 변환했습니다. 명시적인 유형 캐스팅 방법을 사용하여 float를 데이터 유형 정수로 성공적으로 변환했습니다.
  4. 우리는 여전히 부동 소수점인 'a' 값을 인쇄했습니다.
  5. 타입 캐스팅 후 결과는 항상 정수 'b'입니다.

이러한 방식으로 C 프로그래밍에서 명시적인 유형 캐스팅을 구현할 수 있습니다.

자주 묻는 질문

타입 변환은 컴파일러가 자동으로 변경하는 것이고, 타입 캐스팅은 캐스트 연산자를 사용하여 명시적으로 요청하는 변경입니다. 캐스팅은 변환의 한 형태입니다.

가능합니다. float를 int로 변환할 때 소수 부분은 버려지고, double을 float로 변환할 때 자릿수는 반올림되며, long을 int로 변환할 때 상위 비트는 버려집니다. 하지만 확장 형변환은 안전하게 유지됩니다.

네. C 언어에서는 포인터 유형을 다른 유형으로 형변환할 수 있으며, 객체 포인터는 void*로, 또는 그 반대로 변환될 수 있습니다. 호환되지 않는 형변환으로 포인터를 역참조하면 정의되지 않은 동작이 발생합니다.

C 언어는 C 스타일의 (타입)값 형변환만 지원합니다. C++ 컴파일러가 의도를 더 명확하게 검사할 수 있도록 static_cast, dynamic_cast, const_cast, reinterpret_cast와 같은 네 가지 안전한 명명된 형변환 기능을 추가합니다.

이 값은 하위 비트만 유지합니다. 값이 너무 크면 결과가 순환되거나 부호가 바뀌므로 먼저 목표 범위에 맞는지 확인해야 합니다.

확장형 형변환을 선호하고, 축소형 형변환 전에 값이 적합한지 확인하며, 정수 나눗셈 전에 피연산자 하나를 부동소수점형으로 형변환하십시오. 위험한 형변환을 표시하는 컴파일러 경고를 활성화하십시오.

네. AI 어시스턴트는 프롬프트를 기반으로 캐스팅 표현식을 작성하고, 프로모션 규칙을 설명하며, 전환 과정에서 데이터 손실이 발생할 수 있는 경우 경고합니다. 결과는 항상 컴파일하여 테스트하십시오.

GitHub 부조종사 주석에서 암시적 및 명시적 형변환 표현식을 제안하며, 여기에는 (유형 이름) 구문이 포함됩니다. Rev컴파일하기 전에 발생할 수 있는 데이터 손실에 대해 각 제안 사항을 검토하십시오.

이 게시물을 요약하면 다음과 같습니다.