주어진 상황에서 문자 배열 (물론 null 문자로 끝남)이 있고 그 직후 메모리의 바로 다음 위치에 0
부호없는 정수 로 저장하려는 경우 컴퓨터는 어떻게 이들을 구별합니까? 두?
pic X occurs m to n depending on v
( 카운트는 직전이 아니라 어디에서나 가능하지만 저장 하는 것이 더 복잡합니다.
주어진 상황에서 문자 배열 (물론 null 문자로 끝남)이 있고 그 직후 메모리의 바로 다음 위치에 0
부호없는 정수 로 저장하려는 경우 컴퓨터는 어떻게 이들을 구별합니까? 두?
pic X occurs m to n depending on v
( 카운트는 직전이 아니라 어디에서나 가능하지만 저장 하는 것이 더 복잡합니다.
답변:
그렇지 않습니다.
문자열 종결자는 모든 0 비트를 포함하는 바이트입니다.
부호없는 int는 각각 0 비트를 포함하는 2 또는 4 바이트 (환경에 따라 다름)입니다.
두 항목은 서로 다른 주소에 저장됩니다. 컴파일 된 코드는 이전 위치의 문자열에 적합한 연산과 후자의 부호없는 이진수에 적합한 연산을 수행합니다. (코드에 버그가 있거나 위험한 영리한 코드가 아닌 한!)
그러나이 모든 바이트는 CPU와 동일하게 보입니다. 메모리에있는 데이터 (가장 일반적으로 사용되는 명령어 세트 아키텍처에서)와 관련된 데이터 유형이 없습니다. 그것은 소스 코드에만 존재하며 컴파일러에만 해당되는 추상화입니다.
편집 추가 : 예를 들어 : 문자열을 구성하는 바이트에 대해 산술을 수행하는 것이 가능합니다. 8 비트 ASCII 문자 문자열이있는 경우 32 (10 진수)를 더하거나 빼서 문자열의 문자를 대문자와 소문자로 변환 할 수 있습니다. 또는 다른 문자 코드로 변환하는 경우 해당 요소의 값을 다른 코드에서 동등한 비트 코딩을 제공하는 배열에 인덱스로 사용할 수 있습니다.
CPU에서 문자는 실제로 매우 짧은 정수입니다. (16, 32 또는 64 대신 각각 8 비트) 인간에게는 값이 읽을 수있는 문자와 관련이 있지만 CPU는 그 사실을 알지 못합니다. 또한 "널 바이트는 문자열을 끝냅니다"의 "C"규칙에 대해 아무것도 알지 못합니다 (많은 답변과 의견에서 언급했듯이 그 규칙이 전혀 사용되지 않는 프로그래밍 환경이 있습니다) .
확실히, x86 / x64에는 REP 접두사와 같은 문자열과 함께 많이 사용되는 몇 가지 명령어가 있지만 원하는 결과를 얻으면 정수 배열에서도 사용할 수 있습니다.
간단히 말해서 차이는 없습니다 (int는 2 또는 4 바이트 너비이고 char은 1입니다).
문제는 모든 최신 라이브러리가 null 종료 자 기술을 사용하거나 문자열 길이를 저장한다는 것입니다. 그리고 두 경우 모두 프로그램 / 컴퓨터는 널 문자를 읽거나 크기에 지시 된만큼의 문자를 읽을 때 문자열 끝에 도달했음을 알고 있습니다.
널 터미네이터가 없거나 길이가 잘못된 경우 프로그램이 메모리에서 읽지 않기 시작하면이 문제가 시작됩니다.
다른 점이 없다. 머신 코드 (어셈블러)에는 변수 유형이 없으며 대신 데이터 유형이 명령어에 의해 결정됩니다.
더 좋은 예로들 수 int
및 float
메모리에 4 바이트가 있다면, 그것이인지 전혀 정보가 없다, int
또는을 float
, 그러나 정수 추가 및 플로트 또한 2 개 가지 지침, 그렇다면 정수 또한이 있습니다 (또는 완전히 뭔가 다른) 명령은 데이터에 사용 된 다음 정수이며 그 반대도 마찬가지입니다.
문자열과 마찬가지로 주소를보고 바이트에 도달 할 때까지 바이트를 계산하는 코드가 있으면 \0
문자열의 길이를 계산하는 함수로 생각할 수 있습니다.
물론 이와 같은 프로그래밍은 완전한 광기 일 것이므로 기계 코드로 컴파일하고 어셈블러에서 거의 아무도 프로그램을 직접 컴파일하지 않는 고급 언어를 사용하는 이유입니다.
과학적인 단일 단어 답변은 메타 데이터입니다.
메타 데이터는 컴퓨터에 특정 위치의 일부 데이터가 정수, 문자열, 프로그램 코드 또는 기타 데이터인지를 알려줍니다. 이 메타 데이터는 프로그램 코드의 일부이거나 (Jamie Hanrahan이 언급했듯이) 어딘가에 명시 적으로 저장 될 수 있습니다.
최신 CPU는 종종 프로그램 코드에 할당 된 메모리 영역과 데이터 영역 (예 : NX Bit https://en.wikipedia.org/wiki/NX_bit )을 구별 할 수 있습니다 . 일부 이국적인 하드웨어는 문자열과 숫자를 구별 할 수도 있습니다. 그러나 일반적인 경우는 코드에서 암시 적 메타 데이터 또는 명시 적 메타 데이터 (객체 지향 VM이 종종 메타 데이터 (유형 / 클래스 정보)를 데이터 (객체)의 일부로 저장함)를 통해 소프트웨어가이 문제를 처리하는 것입니다. .
서로 다른 종류의 데이터를 구별하지 않는 이점은 일부 작업이 매우 단순해진다는 것입니다. I / O 하위 시스템은 디스크에서 읽거나 디스크에 쓰는 데이터가 실제로 프로그램 코드, 사람이 읽을 수있는 텍스트 또는 숫자인지 알 필요가 없습니다. 그것은 기계를 통해 운송되는 모든 비트입니다. 프로그램 코드가 멋진 타이핑 문제를 처리하게하십시오.
그렇지 않습니다. 당신은 그것을 할!
또는 컴파일러 / 통역사.
컴퓨터에 지시에 0
따라 숫자 를 추가하도록 지시하면 됩니다. 컴퓨터가 0
'에 도달 한 후 데이터 인쇄를 중지하도록 지시 하면' \0'
문자 '로 표시됩니다.
언어에는 데이터 처리 방법을 보장하는 메커니즘이 있습니다. C는 변수 타입 등이 int
, float
그리고 char
, 컴파일러가 각각의 데이터 타입에 대한 권리의 지시를 생성한다. 그러나 C를 사용하면 변수에서 다른 유형의 다른 변수로 데이터를 캐스트 할 수 있으며 심지어 포인터를 숫자로 사용할 수도 있습니다. 컴퓨터에는 다른 것과 비슷합니다.