"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 주간 블로그: 이번 주에 만난 네 가지 흥미로운 일

주간 블로그: 이번 주에 만난 네 가지 흥미로운 일

2024-11-08에 게시됨
검색:444

1. VS Code에서 혼동되는 파일 이름 방지

VS Code에서 C 파일을 작성할 때 파일 이름을 first.c.cpp로 지정했습니다. 프로그램을 완료한 후 실행 중에 오류가 발생했습니다. 30분 동안 문제를 해결한 후 다음 파일 이름에 문제가 있음을 발견했습니다.
.c 확장자로 인해 IDE가 이를 C 프로그램으로 잘못 식별하게 되었고, 이로 인해 VS Code는 g(C 컴파일러) 대신 gcc(C 컴파일러)를 사용하여 코드를 컴파일하게 되었습니다.

Weekly Blog: Four Interesting Things I Encountered This Week

캡션: 정말 바보같네요!

  • 해결책:tasks.json 파일에서 '명령' 줄을 gcc에서 g로 변경합니다.
  • 학습 내용: 불필요한 혼란을 피하기 위해 C 파일에 명확한 .cpp 확장자를 사용하세요.

2. Java의 크로스 플랫폼 디자인 철학

Java의 디자인 철학은 기존의 컴파일 언어와 크게 다릅니다.

전통적인 편집물:

  1. C와 같은 언어는 특정 목적을 위해 기계어 코드로 직접 컴파일됩니다. 플랫폼(예: Windows, Mac, Linux)
  2. 결과 실행 파일(.exe)은 대상 플랫폼에서만 실행될 수 있습니다.

Java의 접근 방식:

  1. 컴파일러는 중간 코드(바이트코드)를 생성합니다.
  2. 이 바이트코드는 JVM(Java Virtual Machine)이 설치된 모든 플랫폼에서 실행될 수 있습니다.
  3. JVM은 바이트코드를 현재 플랫폼의 기계어 코드로 변환하는 역할을 담당합니다.

이 디자인은 "한 번 작성하면 어디서나 실행"이라는 목표를 달성하는 반면, C 실행 파일(.exe 파일)은 단일 플랫폼에서 실행되도록 제한됩니다.

  • 장점:수정 없이 동일한 프로그램을 다른 컴퓨터에서 실행할 수 있습니다.

  • 단점:프로세스의 추가 단계로 인해 기존 방법에 비해 컴파일 속도가 약간 느려질 수 있습니다.

한 번 작성하면 어디서나 실행 가능

                             ---------James Gosling

3. 두 가지 일반적인 컴파일 모드

  • 디버그 모드는 디버깅을 지향하며 최적화가 적습니다. 주로 프로그램 디버깅에 사용됩니다.
  • 릴리스 모드는 주로 릴리스 버전을 생성하는 데 사용되며, 최적화에 중점을 두고 기본적인 디버깅 기능만 유지합니다.

Weekly Blog: Four Interesting Things I Encountered This Week

4. 낮은 수준의 관점에서 강제 유형 캐스팅 이해

Little Endian: 최하위 바이트가 가장 낮은 주소에 저장됩니다. 이 저장 방법은 낮은 주소에서 높은 주소로 발생하는 CPU 메모리 읽기를 용이하게 하기 위해 등장했습니다. 흥미롭게도 이는 인간이 일반적으로 숫자를 쓰는 것과 반대입니다.
예를 들어:
329933의 이진 표현은 00000000 00000101 00001000 11001101
입니다. 리틀 엔디안 스토리지: 11001101 00001000 00000101 00000000
보시다시피 Little Endian은 이진 표현에서 바이트 순서를 반대로 바꿉니다. 그러나 각 바이트 내의 비트 순서는 변경되지 않는다는 점에 유의하는 것이 중요합니다!

강제 형변환을 이해하는 재미있는 게임

타입 캐스팅을 소개하면서 제가 가장 좋아하는 실험입니다!

# include 
int main()

{
    int a;

    int *p;

    a=329933;

    p=&a;

    char *q;

    q=(char*)p;

    printf("%d\n",*p);

    printf("%d\n",*q);

}

산출:

329933
-51

왜 -51이 출력되는지 궁금합니다.

설명

  1. (char*)&a는 int의 첫 번째 바이트를 가리킵니다. 첫 번째 바이트 11001101은 char로 해석됩니다.
  2. 가장 높은 비트 1은 음수를 나타내며, 2의 보수 변환 후 -51을 얻습니다. (2의 보수에 익숙한 친구들은 그것이 실제로 -51을 나타내는지 확인할 수 있습니다.)

우연의 일치인가요? 두 가지 예를 더 시도해 보겠습니다.

printf("%d\n",*(q 1));
printf("%d\n",*(q 2));

해 보세요:

  1. 위에 언급된 코드를 실행하고 출력을 관찰해 보세요.
  2. 두 번째 및 세 번째 바이트가 그러한 출력을 생성하는 이유를 고려하십시오. 댓글 섹션에서 이 문제에 대해 자유롭게 토론하세요.
  3. 다른 데이터 유형에 강제 유형 캐스팅을 적용할 수 있나요? 한번 시도해 보세요!

추가 정보: 2의 보수

강제 유형 캐스팅을 수행할 때 (char)p는 4바이트 int의 첫 번째 바이트 주소인 11001101을 가리킵니다.
가장 왼쪽의 1은 음수 기호를 나타내며 음수임을 나타냅니다. 2의 보수를 적용하면 다음과 같은 결과가 나옵니다: 0110011(마지막 7비트)

(참고: 양수의 경우 2의 보수는 단순히 십진수를 이진수로 표현한 것입니다. 음수의 경우 2의 보수는 가장 왼쪽(가장 높은) 비트를 제외한 모든 비트를 반전시킨 다음 1을 더하여 얻습니다. 가장 오른쪽 비트로 이동합니다.)

이를 십진수로 변환하면 -51이 됩니다. 흥미롭죠?

2의 보수의 이점:

  1. 가산기만을 사용하여 양수 유형과 정수 유형을 모두 계산할 수 있으므로 뺄셈이 필요 없으며 하드웨어 요구 사항이 단순화됩니다.
  2. 0에 대한 고유한 이진 표현을 제공합니다. 10000000은 -0이 아니라 -128을 나타내고, 00000000은 0이 아닌 0을 나타냅니다.

많은 사람들이 왜 -128인지 궁금해합니다. 답을 알고 있다면 댓글 섹션에서 자유롭게 공유해 주세요. 이는 다른 사람에게도 도움이 될 뿐만 아니라 자신의 생각을 정리하는 데도 도움이 됩니다.

릴리스 선언문 이 기사는 https://dev.to/stockdale_roger_999e292a7/weekly-blog-four-interesting-things-i-encountered-this-week-eo9?1에 복제되어 있습니다. 침해가 있는 경우에는 [email protected]으로 문의하시기 바랍니다. 그것을 삭제하려면
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3