리터럴 상수에 대해서
다슬
질문 제목 : 리터럴 상수에 대해서질문 내용 : 제가 오늘 아침에 이런 질문을 했었는데요.int a = 4+5;여기서보면 4,5가 변수 a에 저장되기 전에 먼저 연산을 하잔아요. 그런데 연산을 하는건 cpu이고, cpu는 메모리공간의 데이터만 조작할 수 있잔아요. 그래서 4,5가 메모리 공간에 올라오는 거구요. 그런데 4,5의 메모리 공간에는 이름이 없으니깐 리터럴 상수라고 하는거잔아요.그렇다면int a = 7;여기서 7도 리터럴 상수가 되는건가요?
근데 7이라는건 연산을 진행하지 않잔아요. 만약 이게 리터럴 상수가 맞다면 4+5처럼 연산식이 아니고, 7만 있다고해도 그 값은 메모리 공간에 올라가는건가요?그리고 한가지 더 궁금한점은 리터럴 상수의 메모리공간의 크기는 어떻게 할 당되는거죠? 일단 메모리 공간이니깐 몇비트던 몇바이트던 그 데이터 값이 저장되어 있는 메모리 공간의 크기는 있을텐데 이건 어떻게 할당되는거고 어떻게 알 수있는거죠?그리고 int a = 1+b 에서 보면 1만 리터럴 상수잔아요. 그럼 b는 단지 숫자가 아니라는 이유로 리터럴 상수가 아니란건가요? 그럼 대체 b는 뭐죠?
그런데 어떤분께서 댓글로int a = 4+5; 는 절대 런타임에 계산되지 않습니다. 컴파일타임에 컴파일러가 이미 9로 계산해서 a에 넣어줍니다.
마찬가지로 int a = 7 하면 a에 7이 들어가 있는거지 7이 어디 따로 있는게 아닙니다.
그리고 일반적으로 상수는 목적파일에서 읽기만 가능한 영역에 컴파일때 최초 기록되어 프로그램 자체에 내장되고, 프로그램이 로드되면 그 읽기만 가능한 영역에서 읽어 쓰도록 되어 있습니다.
자세한건 elf 같은 실제 실행파일 뜯어보세요.
이런 원리로 문자열 상수나 정적배열을 지나치게 크게 만들경우 그만큼 프로그램의 목적파일 자체가 커지는 부작용이 있습니다. 그레서 파일에서 텍스트를 읽어오는거고, 동적할당이 필요해지는 거고요이렇게 달아주셨는데요.
제가 이 말 뜻을 정확히 이해를 못하겠어서 질문 올립니다.
댓글의 내용을 제가 이해할 수 있는 선까지 정리해보면, int a = 4+5;는 cpu에 의해 연산되지 않고, 컴파일타임에서 컴파일러가 연산을 하고 a에 값을 넣어주고, int a = 7도 a에 그냥 7이 들어가는거라고...
그렇다면 결국엔
4+5나, 7은 cpu에 의해 연산되지 않으니 메모리 공간안에 올라가지 않는다는 말이란 거죠?
그런데 제가 열혈강의 c 프로그래밍 책으로 공부를 하는데 거기에 나와있는 내용은int val = 30 + 40; 이란게 있으면,
30+40이라는 연산을 컴퓨터가 진행해야 한다는 뜻인데, 그러기 위해서는 30 이라는 정수도, 40 이라는 정수도 메모리상에 존재해야 한다. 그래야 컴퓨터가 연산을 할 수 있게 된다. 왜냐하면 덧셈이라는 연산은 cpu에 의해서 진행이 되는데, cpu는 메인 메모리상(ram을 의미함)에 존재하는 데이터들만 조작(연산)할 수 있기 때문이다.이렇게 책에 설명되어있는데, 그럼 댓글다신분 말이랑 책이랑 말이 쫌 안맞는거같아서 다시 물어봅니다.
일단 책에서는 3+4의 연산은 cpu가 하는데 cpu는 메인 메모리상에 존재하는 데이터들만 조작할 수 있기 때문에 3,4는 메모리상에 올라가게된다.
이거고, 댓글 다신분은
3+4의 연산은 cpu가 하는것이아니라, 컴파일타임에 컴파일러가 계산을해서 a에다가 값을 넣는다. 그러므로 3+4는 메모리상에 올라가지 않는다.여튼 재 최종질문은
1. int a = 3,4;에서 3,4는 메모리상에 올라가는지, 컴파일러에 의해 처리되는지 그냥 저 식에 관해서 쫌 디테일하고도 이해하기 쉽게 설명해주세요.
2. int a = 7; 이란것도 쫌 자세히 설명해주세요. 이해하기쉽게;
3. 댓글 단분의 내용을 제가 앞부분 밖에 이해를 못한거같은데 댓글다신분의 전체적인 내용을 잘 설명해주시면 감사하겠습니다.
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2676182 | 숫자 순서대로 배열하는법 | 권뉴 | 2024-11-24 |
2676152 | 기본적인거 하나 질문드립니다. | 개미 | 2024-11-24 |
2676124 | 함수선언관련 질문이에요~...털썩..수정완료 (2) | 가지 | 2024-11-24 |
2676092 | C언어 책 (2) | 아서 | 2024-11-24 |
2676065 | 웹사이트 또는 메신저 등에서 원하는 텍스트를 검사하는방법?? (1) | 모든 | 2024-11-23 |
2676033 | 배열 기초연습중 발생하는 에러 ㅠㅜ... | Creative | 2024-11-23 |
2676005 | keybd_event 게임 제어 | 영글 | 2024-11-23 |
2675900 | 진짜기본적인질문 | 글길 | 2024-11-22 |
2675845 | 수정좀해주세요ㅠㅠㅠ | 해골 | 2024-11-21 |
2675797 | 병합 정렬 소스 코드 질문입니다. (2) | 도래솔 | 2024-11-21 |
2675771 | 큐의 활용이 정확히 어떻게 되죠?? | 해긴 | 2024-11-21 |
2675745 | 도서관리 프로그램 질문이요 | 도리도리 | 2024-11-20 |
2675717 | 2진수로 변환하는것! (3) | 동생몬 | 2024-11-20 |
2675599 | for문 짝수 출력하는 법 (5) | 널위해 | 2024-11-19 |
2675575 | Linux 게시판이 없어서.. | 첫삥 | 2024-11-19 |
2675545 | 구조체 이용할 때 함수에 자료 넘겨주는 것은 어떻게 해야 하나요? | 아연 | 2024-11-19 |
2675518 | 사각형 가로로 어떻게 반복해서 만드는지좀.. 내용 | 신당 | 2024-11-18 |
2675491 | !느낌표를 입력하는것은 어떻게합니까~~?ㅠㅠ (5) | 사지타리우스 | 2024-11-18 |
2675411 | 파일입출력으로 받아온 파일의 중복문자열을 제거한 뒤 파일출력 | 앨버트 | 2024-11-17 |
2675385 | 링크드리스트 주소록 질문드립니다. (1) | 겨루 | 2024-11-17 |