Форум программистов, компьютерный форум, киберфорум
Теория программирования
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
171 / 5 / 2
Регистрация: 27.11.2024
Сообщений: 45

Как определяется тип переменной?

06.12.2024, 17:51. Показов 969. Ответов 9

Студворк — интернет-сервис помощи студентам
возможно, вопрос сформулирован некорректно, но поверьте, мне трудно как-то правильно это сделать и если б я мог, то обязательно сформулировал бы почётче.

попытаюсь раскрыть суть вопроса. в общем если смотреть по таблице аски, то символ 3 будет кодироваться числом 32 в 16ричке, что запишется определённым двоичным кодом в памяти. но кроме символа 3 я могу записать число типа unsigned int 50, который будет иметь такой же двоичный код. да, размер данных отличается, но как процессор понимает, хотим мы получить инт или чар, если двоичный код у них одинаков?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2024, 17:51
Ответы с готовыми решениями:

Макрос определяется как тип
Добрый вечер! Есть макрос:#define $PURE __attribute__((pure)) И есть определение функции:$PURE static constexpr uint8_t pin(uint8_t...

Как определить тип переменной, ссылающейся на определённый класс? Нужен именно тип, а не ссылка на обьект!
interface HowDefineMyType { void info(); } class A implements HowDefineMyType { public int x;

Получить тип переменной и задать её переменной типа тип
то есть int A = 213213 Type B = A.GetType() - ну надо что-то вроде этого но для Type b = typeof(a.Max(p =>...

9
152 / 136 / 26
Регистрация: 12.12.2020
Сообщений: 1,128
06.12.2024, 18:13
при объявлении переменной определяется ее тип.

А дальше возможны варианты. Есть такое понятие как "приведение типов". Это когда одну переменную чар, присваивают переменной инт. Бывает явное и не явное. В первом случае программист явно прописывает что и как он хочет преобразовать и в каком порядке. Во втором варианте полагаются на компилятор.
1
1963 / 819 / 114
Регистрация: 01.10.2012
Сообщений: 4,768
Записей в блоге: 2
06.12.2024, 23:25
Лучший ответ Сообщение было отмечено Makiavelly Uber как решение

Решение

Цитата Сообщение от Makiavelly Uber Посмотреть сообщение
но как процессор понимает, хотим мы получить инт или чар, если двоичный код у них одинаков?
А процессор ничего и не понимает, он тупо выполняет машинные команды что подсунул ему компилятор. А вот компилятор понимает, у него есть описание типа, и поэтому он генерирует команды которые корректно работают с int или char. На выполнении (говорят "в runtime") никакой инфы о типах нет, все переменные - просто ячейки памяти, есть их адреса и все. Конечно речь идет об "императивных" языках типа C/C++/Pascal, в др системах тип может храниться
1
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,699
07.12.2024, 05:07
Цитата Сообщение от Makiavelly Uber Посмотреть сообщение
как процессор понимает
Процессору даёт всю информацию программист. Программист указывает не только значение "32", но и указывает тип данных.

Другой вопрос, откуда эту информацию берёт программист? Так?
1
Модератор
Эксперт функциональных языков программирования
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
09.12.2024, 10:57
Языки бывают безтиповыми и типизированными.
В типизированных языках каждое значение* (здесь и далее - в широком смысле) имеет тип.
В языках с динамической типизацией переменные могут хранить значения любых типов.
В языках со статической типизацией каждая переменная может хранить значение только определённого (на этапе компиляции) типа. То есть, каждая переменная имеет тип.
В языках со слабой типизацией допускаются неявные преобразования типов значений. Это небинарная классификация. "Уровень слабости" определяется заданным (в спецификации языка) набором допустимых неявных преобразований.

*Значение (в широком смысле) - это цепочка бит произвольной длины.
В типизированных языках каждому значению ставятся в соответствие метаданные, описывающие тип ("физический смысл") значения.
Логически все значения можно поделить на два класса - объекты и значения (в узком смысле) - по тому, как они сравниваются. Например, два одинаковых мяча - это разные мячи (объекты) два одинаковых числа - одно и то же число (значение).
В некоторых языках существует "синтаксическое" деление на объекты и значения - по тому, как они хранятся в памяти. Это деление не обязательно совпадает с описанным выше логическим делением.

(выделил жирным ответ на вопрос топикстартера)
1
171 / 5 / 2
Регистрация: 27.11.2024
Сообщений: 45
09.12.2024, 11:23  [ТС]
да это всё понятно. вопрос был в том, как именно компилятор даёт понять, данные какого типа используются данным адресом.

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

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

возможно, не очень понятна моя мысль, поэтому попытаюсь переформулировать: (для простоты возьмём код написанный на языке ассемблера) я предполагаю, что при трансляции в машинный код ассемблер там, где это нужно, машинным кодом записывает команды процу, что надо выполнить определённые действия, направленные на поиск символа в таблице аски, закодированного битами, лежащими по адресу некой, нужной нам, переменой. я прав?
0
Модератор
Эксперт функциональных языков программирования
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
09.12.2024, 13:08
Лучший ответ Сообщение было отмечено Makiavelly Uber как решение

Решение

Цитата Сообщение от Makiavelly Uber Посмотреть сообщение
даже в ассемблере нет команды, которая руководила этим процессом,
А ему и не надо. В ассемблере вызывается системная функция. Например, "DOS Fn 09H: Выдать строку на дисплей". Байты в символы превращает "Консоль". В зависимости от настроек она может одни и те же байты превратить в разные символы.

В спецификации типизированных языков есть синтаксические правила задания литералов.

Например, в ассемблере есть возможность задать байты символами в коде.
Assembler
1
msg DB 'Hello, World!$'
Перевод символов в байты выполняет компилятор, который превращает ассемблерный код в машинный код.
1
1963 / 819 / 114
Регистрация: 01.10.2012
Сообщений: 4,768
Записей в блоге: 2
09.12.2024, 16:02
Цитата Сообщение от Makiavelly Uber Посмотреть сообщение
возможно, не очень понятна моя мысль, поэтому попытаюсь переформулировать: (для простоты возьмём код написанный на языке ассемблера) я предполагаю, что при трансляции в машинный код ассемблер там, где это нужно, машинным кодом записывает команды процу, что надо выполнить определённые действия, направленные на поиск символа в таблице аски, закодированного битами, лежащими по адресу некой, нужной нам, переменой. я прав?
Нет. Никаких имен/таблиц на выполнении нет (мелкие подробности опускаем). Никто ничего не ищет. Все нужные команды заранее созданы компилятором. Пример
C++
1
2
3
4
5
6
int a;
unsigned int b;
double c;
 
c += a;  
c += b;
a и b имеют одинаковый размер и, возможно, значение. Но компилятору известны их типы, поэтому он создаст разный код для 2 последних строк
1
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,699
09.12.2024, 18:06
Лучший ответ Сообщение было отмечено Makiavelly Uber как решение

Решение

Цитата Сообщение от Makiavelly Uber Посмотреть сообщение
ибо если данные числовые, то лезть в таблицу аски при выводе в консоль не нужно (ну или нужно найти в таблице аски такой символ, который совпадает с числовым символом по написанию), а при выводе некого символа в кодовую таблицу надо залезть.
Вы говорите о некой функции типа print(). Если вы в неё передали переменную типа char или int, то в первом случае будет использоваться ASCII, а во втором случае другой алгоритм. Но иногда print() умеет работать только с типом string, она заругается, попросит не подсовывать ей char или int вместо string. Такое тоже бывает.
То есть типы данных указываются не только для переменных, но и у функций.
1
171 / 5 / 2
Регистрация: 27.11.2024
Сообщений: 45
09.12.2024, 19:45  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Перевод символов в байты выполняет компилятор, который превращает ассемблерный код в машинный код.
думаю, это и есть ответ, который я ждал. спасибо!

Добавлено через 8 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
Никаких имен/таблиц на выполнении нет (мелкие подробности опускаем)
да, я понимаю, что при выполнении никто никуда не лазит. видимо, не совсем понятно выразился. имел ввиду, что в готовом *.ехе файле (если данные инициализированные) будет храниться машинный код, который (при выводе текста на консоль) будет означать вывод некоего символа из аски таблицы, если эта переменная задана аски символом

Добавлено через 5 минут
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Если вы в неё передали переменную типа char или int
вы говорите о высокоуровневых языках. в ассемблере тип byte могут иметь как числа (int), так и символы (char), ну и поэтому собственно у меня возник вопрос, а как различить. но судя по полученным ответам (и по вашему ответу в том числе — спасибо!), это дело компилятора, который решает вопрос "путаницы" (говорю путаницы, потому что до полученных ответов я меня всё это путало)
Цитата Сообщение от Mikhaylo Посмотреть сообщение
в первом случае будет использоваться ASCII, а во втором случае другой алгоритм
спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2024, 19:45
Помогаю со студенческими работами здесь

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной, значение переменной как это сделать?

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной, значение переменной как это сделать?

Как отсортирвоать контейнер, если его тип определяется по ходу выполнения программы? (динамическая идентификация типов)
собсно #include <windows.h> #include <stdio.h> #include <vector> #include <list> #include <algorithm> #include <cxxabi.h> ...

Как узнать тип переменной
Всем привет! У меня возникла задача, решить которую я не смог. Пишу в PlatformIO IDE для Arduino Mega. Задача состояла в определении типа...

Как узнать тип переменной?
Здравствуйте! Не давно начал заниматься изучением языка С++, и возник вопрос. Как узнать узнать каким типом является переменная, то есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru