Определение типа данных значения в памяти в C? - PullRequest
3 голосов
/ 18 марта 2012

Как программа / приложение узнает, что данные в адресе памяти имеют определенный тип данных.

Например, предположим, что есть int a;, и предположим, что переменная a хранится в адресе 0x100.Где хранится информация о том, что она имеет тип int?

Ответы [ 5 ]

12 голосов
/ 18 марта 2012

В таких языках, как C, информация всегда "сохраняется" в том виде, в каком вы интерпретируете данные . Компилятор добавляет некоторую привлекательность, которая в некоторой степени понимает типы ваших переменных и пытается предотвратить операции, которые не имеют смысла.

Например, предположим, что у вас есть биты: 0xFFFFFFFF. Если вы интерпретируете их как "32b без знака int", вы получите 4294967295. Если вы интерпретируете их как «32b со знаком int», вы получите -1 (*) . Если вы интерпретируете их как двойные, бог знает, что вы получите.

6 голосов
/ 18 марта 2012

Нигде, это просто предполагается кодом.

3 голосов
/ 18 марта 2012

Приложение переменного тока не хранит информацию о типе.Единственное правоприменение заключается в том, как используются данные.А в C очень просто злоупотреблять этим принуждением.

Рассмотрим следующее:

short s;
short *p = &s;
*(long*)p = 0;

Этот код берет указатель на короткую переменную, а затем записывает в неепеременная, как будто это было долго.Это перезаписывает память за пределы того, что принадлежит используемой переменной, вызывая неопределенное поведение.

2 голосов
/ 18 марта 2012

Эта информация не сохраняется.Например, вы можете делать такие вещи, как

int i=15;
char *p=(char*)&i;
char c=*p; //Now, c contain the first byte of 15, which may be 15 or 0

Но не делайте этого, если вы действительно не знаете, что делаете.Неосторожно делать подобные вещи - это распространенный путь к ошибкам.

1 голос
/ 18 марта 2012

Когда программа на C перестает связываться и не нуждается в каких-либо символах снаружи, эти данные больше не существуют.

Типы данных связаны с языком, когда исполняемый файл готов, язык больше не играет роли, так как теперь это все память и процессор.

...