С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
rikimaru2013
C++ Game Dev
2473 / 1141 / 349
Регистрация: 30.11.2013
Сообщений: 3,709
1

Размер int на х64

15.12.2015, 21:37. Просмотров 1214. Ответов 25
Метки нет (Все метки)

Добрый вечер, всегда помнил и читал об этом где-то:
размер int равен машинному слову(совокупность регистра ОС, разрядности шины, регистра процессора).

Почему для x64 сборки VS 2015:

C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
 
int main()
{
   cout << sizeof( int ) << endl;
   cout << sizeof( int* ) << endl;
}
Output:
4
8
Почему int не равен 8 байт ... .
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2015, 21:37
Ответы с готовыми решениями:

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b'...

Размер INT
int a = 99999000000; cout &lt;&lt;a; Выводит 12345646 типа такова. без -! ...

Размер указателя short int
Доброе утро. Возник вопрос почему short int = 8 байт? Он же должен занимать 2...

От чего зависит размер char и int
Задача на С. Есть структура: struct myStruct { char a; int b; }; От...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H...

25
nord_v
329 / 177 / 80
Регистрация: 22.08.2013
Сообщений: 724
15.12.2015, 22:03 2
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Почему int не равен 8 байт ... .
Почему указатель на int равен 8 байтам? x86 - это же 32-х битные адреса.
1
rikimaru2013
15.12.2015, 23:09  [ТС]
  #3

Не по теме:

х64 опечатка же ж. Модераторы поменяйте название темы пожалуйста.

0
ValeryS
Модератор
7376 / 5576 / 708
Регистрация: 14.02.2011
Сообщений: 18,957
15.12.2015, 23:17 4
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Почему int не равен 8 байт
потому что ради совместимости, куча программ написано, решили оставить 4 байта
проверь long у 32х биток он тоже был 4 байта
1
rikimaru2013
C++ Game Dev
2473 / 1141 / 349
Регистрация: 30.11.2013
Сообщений: 3,709
15.12.2015, 23:26  [ТС] 5
Цитата Сообщение от ValeryS Посмотреть сообщение
потому что ради совместимости, куча программ написано, решили оставить 4 байта
получается выражение про машинное слово не верное уже? Я почем-то уверен, что вычитал про него у кого-то с именитых плюсовиков в книге. И такие вещи про "решили оставить" нельзя найти в стандарте(С++ или С) (потому, что я искал там), а лишь в декларациях поведения х64 архитектур?
0
ValeryS
Модератор
7376 / 5576 / 708
Регистрация: 14.02.2011
Сообщений: 18,957
15.12.2015, 23:35 6
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
получается выражение про машинное слово не верное уже?
не знаю
у интелов ради совместимости сверху вниз регистр бьется
AH AL 8 бит
AX 16 бит
EAX 32 бит
RAX 64 бит
и все это один регистр,точнее части его и целое, что есть машинное слово?
нужно проверять на чистых 64 битках, но кроме АРМов мне ничего на ум не приходит

Добавлено через 2 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
решили оставить" нельзя найти в стандарте(С++ или С)
и не найдешь там есть гарантия что
char<=short<=int<=long
встречались мне такие архитектуры где и char 32 бита
посему не закладывайся на размер а измеряй сам
1
rikimaru2013
C++ Game Dev
2473 / 1141 / 349
Регистрация: 30.11.2013
Сообщений: 3,709
15.12.2015, 23:54  [ТС] 7
что есть машинное слово?

wiki
In many programming environments for C and C-derived languages on 64-bit machines, "int" variables are still 32 bits wide, but long integers and pointers are 64 bits wide. These are described as having an LP64 data model. Another alternative is the ILP64 data model in which all three data types are 64 bits wide, and even SILP64 where "short" integers are also 64 bits wide.[35] However, in most cases the modifications required are relatively minor and straightforward, and many well-written programs can simply be recompiled for the new environment without changes. Another alternative is the LLP64 model, which maintains compatibility with 32-bit code by leaving both int and long as 32-bit. "LL" refers to the "long long integer" type, which is at least 64 bits on all platforms, including 32-bit environments.

Determine word size of my processor
Your assumption about sizeof(int) is untrue

stackoverflow
sizeof(int) is not always the "word" size of your CPU. The most important question here is why you want to know the word size.... are you trying to do some kind of run-time and CPU specific optimization?

That being said, on Windows with Intel processors, the nominal word size will be either 32 or 64 bits and you can easily figure this out:

if your program is compiled for 32-bits, then the nominal word size is 32-bits
if you have compiled a 64-bit program then then the nominal word size is 64-bits.
This answer sounds trite, but its true to the first order. But there are some important subtleties. Even though the x86 registers on a modern Intel or AMD processor are 64-bits wide; you can only (easily) use their 32-bit widths in 32-bit programs - even though you may be running a 64-bit operating system. This will be true on Linux and OSX as well.

Moreover, on most modern CPU's the data bus width is wider than the standard ALU registers (EAX, EBX, ECX, etc). This bus width can vary, some systems have 128 bit, or even 192 bit wide busses.

If you are concerned about performance, then you also need to understand how the L1 and L2 data caches work. Note that some modern CPU's have an L3 cache. Caches including a unit called the Write Buffer


Оставлю тут ответы вдруг кто с поисковика сюда зайдет.


Да неожидано для меня мир ушёл из под ног С одной стороны, если нужно точное количество бит то int32_t подобные, но на такой простой вопрос про int на х64 не могу ответить - аж стыдно (
0
Evg
Эксперт CАвтор FAQ
19361 / 7210 / 538
Регистрация: 30.03.2009
Сообщений: 20,162
Записей в блоге: 30
16.12.2015, 15:19 8
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Почему int не равен 8 байт
Если бы int был равен 8 байтам, то более коротких размеров остаётся 3 штуки (1, 2, 4), а более коротких типов - всего два (char и short). В итоге при 8-байтном int'е нормальную систему построить нельзя

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
размер int равен машинному слову(совокупность регистра ОС, разрядности шины, регистра процессора)
Скорее всего высосано из пальца, либо было так давным давно

Добавлено через 1 минуту
Чисто на всякий случай: http://www.viva64.com/ru/a/0050/ имеет смысл табличку посмотреть
1
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.12.2015, 16:16 9
Цитата Сообщение от Evg Посмотреть сообщение
а более коротких типов - всего два (char и short)
bool, wchar_t, char16_t, char32_t
0
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
16.12.2015, 16:29 10
https://msdn.microsoft.com/ru-ru/library/cc953fe1.aspx

https://msdn.microsoft.com/ru-ru/library/29dh1w7z.aspx
0
Evg
Эксперт CАвтор FAQ
19361 / 7210 / 538
Регистрация: 30.03.2009
Сообщений: 20,162
Записей в блоге: 30
16.12.2015, 16:53 11
С каких это пор в языке Си есть встроенные типы bool, wchar_t, char16_t или char32_t? Они являются typedef'ами на базовые типы а-ля short, int и т.п.
0
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.12.2015, 17:13 12
Цитата Сообщение от Evg Посмотреть сообщение
С каких это пор в языке Си
С каких пор темы в разделе C++ относятся к Си?

Добавлено через 20 секунд
Цитата Сообщение от Evg Посмотреть сообщение
Они являются typedef'ами на базовые типы а-ля short, int и т.п.
Это самостоятельные типы в C++.
1
Evg
Эксперт CАвтор FAQ
19361 / 7210 / 538
Регистрация: 30.03.2009
Сообщений: 20,162
Записей в блоге: 30
16.12.2015, 17:45 13
Цитата Сообщение от Tulosba Посмотреть сообщение
С каких пор темы в разделе C++ относятся к Си?
А... т.е. разработчики вполне могли бы сделать компилятор C++ с 8-байтным int'ом, но для компилятора C оставить 4-байтный int. Ну-ну
0
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.12.2015, 17:53 14
Цитата Сообщение от Evg Посмотреть сообщение
т.е. разработчики вполне могли бы сделать компилятор C++ с 8-байтным int'ом, но для компилятора C оставить 4-байтный int. Ну-ну
Я разве говорил что-то подобное?
0
Evg
Эксперт CАвтор FAQ
19361 / 7210 / 538
Регистрация: 30.03.2009
Сообщений: 20,162
Записей в блоге: 30
16.12.2015, 18:04 15
Цитата Сообщение от Tulosba Посмотреть сообщение
Я разве говорил что-то подобное?
А я не вижу других причин, по которым могла бы сработать отмазка, что это раздел Си++, а не Си
0
rikimaru2013
C++ Game Dev
2473 / 1141 / 349
Регистрация: 30.11.2013
Сообщений: 3,709
16.12.2015, 18:13  [ТС] 16
Цитата Сообщение от Evg Посмотреть сообщение
А я не вижу других причин, по которым могла бы сработать отмазка, что это раздел Си++, а не Си
Думаю там ишлось о том, что Стандарт С++ раздел 3.9.1.7 предусматривает существование этих integral types

Types bool, char, char16_t, char32_t, wchar_t, and the signed and unsigned integer types are collectively
called integral types.48 A synonym for integral type is integer type. The representations of integral types
shall define values by use of a pure binary numeration system.49 [ Example: this International Standard
permits 2’s complement, 1’s complement and signed magnitude representations for integral types. —end
example ]
И понятное дело не входят в набор целочисленных фундаментальных типов в 3.9.1.2, но даже я вижу, что вы написали "Си" в разделе "С++" уже вносит смуту.

Получается есть "чистый си" который не относится к разделу и языку, и "подмножестве си, которое входит в состов языка С++", которое смело называть С++ в целом и не надо как вы отсоединять эту часть в фразу "си". Если описывать "С++" все будут подразумивать уже "С родителя, С++ 98, С++ 0х, С++11, С++14, С++17"
0
Evg
Эксперт CАвтор FAQ
19361 / 7210 / 538
Регистрация: 30.03.2009
Сообщений: 20,162
Записей в блоге: 30
16.12.2015, 18:27 17
Языки Си и Си++ всегда идут в паре. Программу всегда можно написать вперемешку на Си и на Си++, более того, библиотеки типа STL внутри себя обращаются к кодам на Си. Уж где-где, а в размерах базовых типов на Си и Си++ вообще всё симметрично. Если ты введёшь какое-то правило по размерам типов для Си++ (типа заведения 8-байтного int'а) и не сможешь его полноценно реализовать для Си, то это правило кроме как в топку никуда не годится

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
но даже я вижу, что вы написали "Си" в разделе "С++" уже вносит смуту.
Что в очередной раз показывает, насколько глубоко прав был castorsky

0
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.12.2015, 18:27 18
Цитата Сообщение от Evg Посмотреть сообщение
не вижу других причин, по которым могла бы сработать отмазка, что это раздел Си++, а не Си
Никаких отмазок нет, просто не надо утверждать, что стандартных C++ типов с упомянутыми ранее свойствами только 2. Будь разговор в сишной ветке, я бы промолчал.
0
rikimaru2013
16.12.2015, 18:34  [ТС]
  #19

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
прав был castorsky
кто это?

0
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.12.2015, 19:08 20
Цитата Сообщение от Evg Посмотреть сообщение
Программу всегда можно написать вперемешку на Си и на Си++
Всегда - нельзя. Но в частных случаях можно. Т.к. Си не есть подмножество плюсов. Я понимаю, что у тебя по Си пятерка с плюсом, но когда ты пишешь в плюсовый раздел форума, не удивляйся, что тебя поправляют именно по C++, если ты заведомо не указал явно, что речь в твоем сообщении сугубо о сях.
0
16.12.2015, 19:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2015, 19:08

Ошибка при сохранении больших чисел в тип int (размер встроенных типов)
В двумерном целочисленном массиве (размер массива: N, M - указываются в ручную)...

Размер для данных (int, char, long, double, short, unsigned, float)
Напишите программу, которая будет определять размер для данных (int, char,...

1.Написать программу, вычисляющую размер памяти, отводимой компилятором под тип int
#include &quot;iostream.h&quot; int main() { int x; cin&gt;&gt;x; cout&lt;&lt;&quot;razmer tipa...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru