Unsigned int unsigned long int: visual studio — C++ difference between unsigned int and unsigned long int
Содержание
C++ разница между unsigned int и unsigned long int
В стандарте C++ гарантируется, что unsigned int
может представлять значения только от 0
до 65535
. Практически это соответствует 16 битам. Реализации (т. е. компиляторы) могут предоставлять unsigned int
с большим диапазоном, но это не требуется.
Для сравнения, unsigned long int
гарантированно сможет представлять значения в диапазоне от 0
до 4294967295
. Практически это соответствует 32 битам. Опять же, реализация может поддерживать более широкий диапазон.
Диапазоны и размеры этих типов определяются реализацией. Реализация должна соответствовать минимальным требованиям и документировать то, что она выбирает.
Нередко реализации предоставляют unsigned int
и unsigned long int
, которые являются 32-разрядными. Или для одного или обоих до be 64 бита. Как вы уже отметили, в документации для Visual Studio 2015 указано, что и unsigned int
, и unsigned long int
представляют значения от 0
до 4294967295
.
Для компилятора, такого как g++, который может быть нацелен на целый ряд систем, выбор часто определяется целевой системой. Таким образом, сборка g++ для 32-разрядной системы может поддерживать разные диапазоны для unsigned long
, чем сборка для системы 64-bit.
Чтобы ответить на ваши вопросы
Для длинных 64 бит без знака выход за пределы потолка 4 294 967 295 является неопределенным поведением или правильным поведением?
Он имеет четко определенное поведение, хотя и может не дать ожидаемых результатов. Целочисленные типы без знака в C++ используют арифметику по модулю. Интегральное значение (типа, который может поддерживать больший диапазон), находящееся за пределами диапазона от 0
до 4294967295
, будет преобразовано таким образом, чтобы оно находилось в этом диапазоне (математически эквивалентно многократному добавлению или вычитанию 4294967296
[обратите внимание на последнюю цифру]). Другими словами, это будет «wrap around».
Если у меня есть приложение, работающее в системе Windows, скомпилированной в Visual Studio, в основном unsigned == unsigned long. Правда или ложь?
Предполагая, что Visual Studio 2015 это правда, как говорится в документации, на которую вы ссылаетесь. Это может быть или не быть верно для будущих продуктов Microsoft — это решение о реализации.
Если у меня есть приложение, скомпилированное компилятором GNU, работающим над Linux/Windows, я должен убедиться, является ли unsigned long == unsigned int или unsigned long == unsigned long long, чтобы избежать переполнения данных. Правда или Ложь
На самом деле, ложь.
Это верно только в том случае, если вы переносите код, который опирается на эти предположения.
Существуют методы, которые вы можете использовать, чтобы ваш код не полагался на истинность таких предположений. Например, вы можете безопасно определить, когда операция, включающая два значения unsigned
, переполняется или переполняется, и в любом случае предпринять действия для получения требуемых результатов. Если все операции проверены надлежащим образом, вы можете избежать зависимости от конкретных размеров типов.
Если у меня есть кроссплатформенное приложение, которое может быть скомпилировано всеми этими компиляторами Visual Studio/GNU/Clang/Intel, я должен четко классифицировать среду с помощью множества препроцессоров, чтобы избежать переполнения данных. Правда или Ложь
Не совсем так. Практически, часто верно.
Если ваш код придерживается областей стандартного C++, существуют методы, позволяющие избежать этого (как я упоминал выше, с возможностью избежать зависимости от размеров типов без знака).
Если ваш код использует или предоставляет оболочки для функций, которые находятся за пределами стандарта C++ (например, функции windows API, posix, которые не входят в стандарт C++), то это часто будет необходимо. Даже в этих случаях можно избежать подобных вещей. Например, поместите версии функции, использующие windows API, в другой источник, чем версии, использующие posix. И настройте процесс сборки (makefile и т. Д.) — например, если вы строите для windows, не компилируйте и не связывайте версии unix.
В чем разница между unsigned long и unsigned long long?
Я ожидал, что размер будет другим. Но оба показывают 8 байт.
#include <iostream>
using namespace std;
int main()
{
cout<<"Size of long:"<<sizeof(unsigned long)<<"\n";
cout<<"Size of Long Long:"<< sizeof(unsigned long long)<<"\n";
}
Output:
Size of long:8
Size of Long Long:8
c++
long-integer
Поделиться
Источник
cppcoder
08 марта 2012 в 04:40
3 ответа
- C++ разница между unsigned int и unsigned long int
Я занимаюсь разработкой C++ на Windows с компилятором Visual Studio, в частности Visual Studio 2015 Update 3. Для некоторых работ, связанных с DSP, я использую unsigned int / unsigned long тип данных. Мне было интересно, в чем разница между этими двумя встроенными типами C/C++. Я немного поискал в…
- Разница между unsigned long и UINT64
В чем разница между unsigned long и UINT64 ? Я думаю, что это одно и то же, но я не уверен. Определение UINT64 является : typedef unsigned __int64 UINT64 (с помощью StdAfx.h)
10
Это два разных типа, даже если они имеют одинаковый размер и представление в какой-то конкретной реализации.
unsigned long
должно быть не менее 32 бит. unsigned long long
должен быть не менее 64 бит. (На самом деле требования сформулированы в терминах диапазонов значений, которые они могут представлять.)
Как вы уже видели, это согласуется с тем, что они оба имеют одинаковый размер, если этот размер составляет не менее 64 бит.
В большинстве случаев тот факт, что они являются различными типами, не имеет большого значения (за исключением того, что вы не можете зависеть от того, что они оба имеют одинаковый диапазон значений). Например, вы можете назначить unsigned long long
объекту unsigned long
, и значение будет преобразовано неявно, возможно, с некоторой потерей информации. Аналогично, вы можете передать аргумент unsigned long long
функции , ожидающей unsigned long
(если только функция не является переменной, например printf
; тогда требуется явное преобразование).
Но один случай, когда это действительно имеет значение, — это когда у вас есть указатели . Типы unsigned long*
и unsigned long long*
не просто различны, они не совместимы с назначением, потому что нет неявного преобразования из одного в другой. Например, эта программа:
int main()
{
unsigned long* ulp = 0;
unsigned long long* ullp = 0;
ulp = ullp; // illegal
}
производит следующее, когда я компилирую его с помощью g++:
c.cpp: In function ‘int main()’:
c.cpp:5:11: error: cannot convert ‘long long unsigned int*’ to ‘long unsigned int*’ in assignment
Еще одно отличие: стандарт C++ не добавлял типы long long
и unsigned long long
до 2011 года. C добавил их в стандарт 1999 года, и это не редкость для компиляторов pre-C++2011 (и pre-C99), предоставляющих их в качестве расширения.
Поделиться
Keith Thompson
08 марта 2012 в 04:44
Поделиться
Vijay Agrawal
08 марта 2012 в 04:49
0
Стандарт гласит , что long long
должен быть по крайней мере того же размера, что и long
, или больше. Соответственно для типов unsigned
, long
и int
.
Фактические значения зависят от реализации и аппаратного обеспечения.
Поделиться
J.N.
08 марта 2012 в 04:44
- В чем разница между копированием unsigned int 2 раза и unsigned long 1 раз в системах 64 bit?
В чем разница между *(unsigned*)d = *(unsigned*)s; d+=4; s+=4; *(unsigned*)d = *(unsigned*)s; d+=4; s+=4; и *(unsigned long*)d = *(unsigned long*)s; d+=8; s+=8; на 64-битных системах?
- unsigned long long to binary
Я пытаюсь проверить установленные биты unsigned long long в c++, используя приведенный ниже алгоритм, который только проверяет, установлен ли бит или нет. Но моя проблема в том, что ответ, который я получаю, неверен. Пожалуйста, помогите мне понять, как unsigned long long хранится в двоичном файле…
Похожие вопросы:
unsigned long long конфликт с uint64_t?
Мы используем специализацию шаблона для некоторого параметра типа, такого как class my_template_class<uint64_t M>: public my_template_class_base<uint64_t> { …. } class…
Проблемы с unsigned long long
Я экспериментировал с ограничениями unsigned long long в C++ и столкнулся с небольшой проблемой. Когда я умножаю 5 миллионов на 5 миллионов вот так: unsigned long long test = 5000000*5000000;…
Как инициализировать тип unsigned long long?
Я пытаюсь инициализировать тип unsigned long long int . Но компилятор выдает ошибку error: integer constant is too large for long type . Инициализация показана ниже : unsigned long long temp =…
C++ разница между unsigned int и unsigned long int
Я занимаюсь разработкой C++ на Windows с компилятором Visual Studio, в частности Visual Studio 2015 Update 3. Для некоторых работ, связанных с DSP, я использую unsigned int / unsigned long тип…
Разница между unsigned long и UINT64
В чем разница между unsigned long и UINT64 ? Я думаю, что это одно и то же, но я не уверен. Определение UINT64 является : typedef unsigned __int64 UINT64 (с помощью StdAfx.h)
В чем разница между копированием unsigned int 2 раза и unsigned long 1 раз в системах 64 bit?
В чем разница между *(unsigned*)d = *(unsigned*)s; d+=4; s+=4; *(unsigned*)d = *(unsigned*)s; d+=4; s+=4; и *(unsigned long*)d = *(unsigned long*)s; d+=8; s+=8; на 64-битных системах?
unsigned long long to binary
Я пытаюсь проверить установленные биты unsigned long long в c++, используя приведенный ниже алгоритм, который только проверяет, установлен ли бит или нет. Но моя проблема в том, что ответ, который я…
преобразование из unsigned long long в unsigned int
Я немного поискал вокруг, пытаясь найти ответ на этот вопрос, но не смог найти четкого ответа. Я видел этот ответ, где он написал в качестве примечания: Правила различны для типов без знака;…
В чем разница между long unsigned int и unsigned long int
Компилятор берет эти два одинаковых. long unsigned int a; unsigned long int a;
unsigned long long int output не работает
следующий код терпит неудачу, когда дает больше чисел, чем 111111111111111111 (19 раз по 1). хотя unsigned long long int должен содержать до 18446744073709551615 (19 чисел), но 111111111111111111…
unsigned-long-long-int — Русский — it-swarm.com.ru
unsigned-long-long-int — Русский — it-swarm.com.ru
it-swarm.com.ru
Java эквивалент unsigned long long?
Используя long int в PHP
Вычисление битов, необходимых для хранения десятичного числа
Как напечатать «unsigned long» в C?
Длинный без подписи на Java
c ++ uint, unsigned int, int
производительность без знака против целых чисел со знаком
Почему int, а не unsigned int используется для циклов C и C++ для циклов?
C обратные биты в целом числе без знака
C/C++ использование int или unsigned int
какой смысл использовать unsigned int в C?
Какой тип данных «длинный длинный»?
Могу ли я конвертировать долго в INT?
Как использовать длинный идентификатор в приложениях Rails?
Как мне конвертировать из int в Long в Java?
Какое максимальное число с плавающей точкой в Python?
Какая разница между длинным длинным и длинным
Литерал xyz типа int находится вне диапазона
Умножение двух целых чисел в C++
«OverflowError: Python int слишком велик для преобразования в C long» в Windows, но не в Mac
Подписанные и неподписанные целые числа
Как определить тип переменной Python?
Итерация по std :: vector: unsigned vs знаковая переменная со знаком
Почему Java не поддерживает беззнаковые целые?
Почему у C нет беззнаковых поплавков?
В чем разница между знаковыми и беззнаковыми переменными?
что такое неподписанный тип данных?
Как получить целочисленное значение со знаком long в python?
неподписанный короткий в Java
Операция сравнения для целых чисел без знака и со знаком
Ключевое слово без знака в C ++
Двойной без знака в C ++?
Что произойдет, если я назначу отрицательное значение переменной без знака?
Как я могу инвертировать биты беззнакового байта в Java?
Предупреждение — сравнение между целочисленными выражениями со знаком и без знака
В чем разница между «int» и «uint» / «long» и «ulong»?
В чем разница между unsigned int и sign int в C?
Можем ли мы сделать неподписанный байт в Java
Почему SQL Server не поддерживает тип данных без знака?
разница между печатью адреса памяти с использованием% u и% d в C?
В чем преимущество zerofill в MySQL?
Подписанные / неподписанные сравнения
В чем разница между подписанным и неподписанным int
Преобразование char * в unsigned char *
Определяется ли поведение целочисленного вычитания без знака?
Отрицательные числа хранятся в памяти как 2-х дополнения. Как процессор узнает, отрицательные они или положительные?
Лучший способ преобразовать целое число со знаком в длинную без знака?
Объявление неподписанного целого в Java
Целые числа со знаком и без знака для длины / количества
Почему size_t без знака?
«strlen (s1) — strlen (s2)» никогда не меньше нуля
Неверное преобразование из неподписанного символа * в символ *
следует использовать size_t или ssize_t
Когда uint8_t char беззнаковый символ?
Неявное преобразование C ++ (подписано + неподписано)
Разница между size_t и unsigned int?
Как преобразовать подписанное в целое число без знака в Python
Почему целое число без знака недоступно в PostgreSQL?
VHDL присваивает литералы
Как использовать целое число без знака в Java 8 и Java 9?
Почему дополнение работает по-другому через printf?
Когда я должен просто использовать «int» по сравнению с типами, специфичными для знака или размера?
Почему целые числа без знака подвержены ошибкам?
Как я могу получить размер std :: vector как int?
Беззнаковые значения в С
Как создать случайное 64-разрядное целое число без знака в C
C инициализировать массив в шестнадцатеричных значениях
В Си, почему «подписанный int» быстрее, чем «unsigned int»?
Правильно ли определено значение std :: is_unsigned <bool> :: value?
Почему (18446744073709551615 == -1) верно?
В чем разница между подписанным и неподписанным двоичным
Почему Kotlin не поддерживает целые числа без знака?
Почему знак отличается после вычитания неподписанного и подписанного?
Генерация случайных значений в C #
Спецификация номера Java (длинная)
WordPrap очень длинная строка
Java: проверка, равен ли бит 0 или 1 в длинной
Как добавить строку в массив string []? Там нет. Добавить функцию
долго долго в C / C ++
Как я могу проверить, приведет ли умножение двух чисел к Java к переполнению?
Как конвертировать / приводить длинные в String?
Невозможно преобразовать из типа объекта в длинный
Java: случайное длинное число в диапазоне <= x <n
Почему ваш тип данных оператора switch не может быть длинным, Java?
Индикатор загрузки Chrome продолжает вращаться во время XMLHttpRequest
длинный двойной против двойного
Длительное нажатие на UITableView
принтф и длинный двойной
Конвертировать long в байтовый массив и добавить его в другой массив
Обнаружить сенсорное нажатие против длительного нажатия против движения?
Гарантируется ли `long` как минимум 32 бита?
Как мне преобразовать Long в byte [] и обратно в java
Короткий опрос и Длинный опрос для веб-приложений реального времени?
Как я могу конвертировать NSString в длинное значение?
Как преобразовать строку в длинный в JavaScript?
UIButton Long Press Event
Как я могу преобразовать данные из строки в длинные в C #
Конвертировать Double в двоичное представление?
Как печатать долго?
Максимальная квота длины строки содержимого (8192) была превышена при чтении данных XML
Content dated before 2011-04-08 (UTC) is licensed under CC BY-SA 2.5. Content dated from 2011-04-08 up to but not including 2018-05-02 (UTC) is licensed under CC BY-SA 3.0. Content dated on or after 2018-05-02 (UTC) is licensed under CC BY-SA 4.0. | Privacy
Unsigned int vs. size_t — программирование
Я замечаю, что современный код на C и С++ использует size_t
вместо int
/unsigned int
почти везде — от параметров для строковых функций C до STL. Мне интересно узнать причину этого и преимущества, которые он приносит.
ОТВЕТЫ
Ответ 1
Тип size_t
— это целочисленный тип без знака, который является результатом оператора sizeof
(и оператора offsetof
), поэтому он гарантированно будет достаточно большим, чтобы содержать размер самого большого объекта вашей системы может обрабатывать (например, статический массив 8Gb).
Тип size_t
может быть больше, равен или меньше, чем unsigned int
, и ваш компилятор может сделать предположения об этом для оптимизации.
Вы можете найти более точную информацию в стандарте C99, раздел 7.17, черновик которого доступен в Интернете в формате pdf, или в стандарте C11, раздел 7.19, также доступен как pdf-проект.
Ответ 2
Классический C (ранний диалект C, описанный Брайаном Керниганом и Деннисом Ритчи в «Языке программирования C», Prentice-Hall, 1978) не дал size_t
. Комитет по стандартам C представил size_t
для устранения проблемы переносимости
Подробно объяснено на Embedded.com (с очень хорошим примером)
Ответ 3
Короче говоря, size_t
никогда не бывает отрицательным, и он максимизирует производительность, потому что его typedef будет представлять собой целочисленный тип без знака, достаточно большой — но не слишком большой — чтобы представить размер максимально возможного объекта на целевой платформе.
Размеры никогда не должны быть отрицательными, и действительно size_t
является неподписанным типом. Кроме того, поскольку size_t
является беззнаковым, вы можете хранить числа, которые примерно в два раза больше, чем у соответствующего типа со знаком, потому что мы можем использовать знаковый бит для представления величины, как и все другие биты в целом числе без знака. Когда мы получаем еще один бит, мы умножаем диапазон чисел, которые мы можем представить, примерно в два раза.
Итак, вы спрашиваете, почему бы просто не использовать unsigned int
? Возможно, он не сможет вместить достаточно большие числа. В реализации, где unsigned int
составляет 32 бита, наибольшее число, которое он может представлять, это 4294967295
. Некоторые процессоры, такие как IP16L32, могут копировать объекты размером более 4294967295
байтов.
Итак, вы спрашиваете, почему бы не использовать unsigned long int
? Это требует снижения производительности на некоторых платформах. Стандарт C требует, чтобы long
занимал не менее 32 бит. Платформа IP16L32 реализует каждый 32-разрядный код в виде пары 16-разрядных слов. Почти все 32-битные операторы на этих платформах требуют двух инструкций, если не больше, потому что они работают с 32-битными в двух 16-битных блоках. Например, для перемещения 32-битной длины обычно требуются две машинные инструкции — по одной для перемещения каждого 16-битного блока.
Использование size_t
позволяет избежать снижения производительности. Согласно этой фантастической статье, «Type size_t
— это typedef, который является псевдонимом для некоторого целого типа без знака, обычно unsigned int
или unsigned long
, но, возможно, даже unsigned long long
. Каждая реализация стандарта C имеет вид предполагается, что целое число без знака будет достаточно большим, но не больше необходимого, чтобы представить размер максимально возможного объекта на целевой платформе «.
Ответ 4
Тип size_t — это тип, возвращаемый оператором sizeof. Это целое число без знака, способное выражать размер в байтах любого диапазона памяти, поддерживаемого на главной машине. Это (обычно) связано с ptrdiff_t в том, что ptrdiff_t является знаковым целочисленным значением, таким, что sizeof (ptrdiff_t) и sizeof (size_t) равны.
При написании кода C вы всегда должны использовать size_t, когда имеете дело с диапазонами памяти.
Тип int, с другой стороны, в основном определяется как размер (подписанного) целочисленного значения, которое хост-машина может использовать для наиболее эффективного выполнения целочисленной арифметики. Например, на многих компьютерах с более старыми компьютерами значение sizeof (size_t) будет 4 (байты), а sizeof (int) будет 2 (байт). 16-разрядная арифметика была быстрее, чем 32-разрядная арифметика, хотя ЦП мог обрабатывать (логическое) пространство памяти до 4 ГБ.
Используйте тип int только тогда, когда вы заботитесь об эффективности, поскольку его фактическая точность сильно зависит от параметров компилятора и архитектуры машины. В частности, стандарт C задает следующие инварианты: sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long), не устанавливая никаких других ограничений на фактическое представление точности, доступной для программист для каждого из этих примитивных типов.
Примечание. Это не то же самое, что и в Java (которое фактически определяет точность бит для каждого из типов «char», «byte», «short», «int» и «long» ).
Ответ 5
Тип size_t должен быть достаточно большим, чтобы хранить размер любого возможного объекта. Unsigned int не должен удовлетворять этому условию.
Например, в 64-битных системах int и unsigned int могут быть 32 бит в ширину, но size_t должен быть достаточно большим, чтобы хранить числа больше 4G
Ответ 6
Эта выдержка из руководства пользователя glibc 0,02 может также иметь значение при исследовании темы:
Существует потенциальная проблема с типом size_t и версиями GCC до выпуска 2.4. ANSI C требует, чтобы size_t всегда был неподписанным. Для совместимости с файлами заголовков существующих систем GCC определяет size_t в stddef.h' to be whatever type the system's
sys/types.h ‘определяет его. Большинство Unix-систем, которые определяют size_t в `sys/types.h ‘, определяют его как подписанный тип. Некоторый код в библиотеке зависит от того, какой size_t является неподписанным, и не будет работать правильно, если он подписан.
Код библиотеки GNU C, который ожидает, что size_t будет неподписанным, верен. Неверное определение size_t как подписанного типа. Мы планируем, что в версии 2.4 GCC всегда будет определять size_t как неподписанный тип и fixincludes' script will massage the system's
sys/types.h ‘, чтобы не противоречить этому.
Тем временем мы обходим эту проблему, явно указывая GCC на использование неподписанного типа для size_t при компиляции библиотеки GNU C. `configure ‘автоматически обнаружит, какой тип GCC использует для size_t, чтобы его переопределить, если это необходимо.
Ответ 7
Если мой компилятор установлен на 32 бита, size_t
— это не что иное, как typedef для unsigned int
. Если мой компилятор установлен на 64 бит, size_t
— это не что иное, как typedef для unsigned long long
.
Ответ 8
size_t — размер указателя.
Таким образом, в 32 битах или общей модели ILP32 (целочисленный, длинный, указательный) size_t составляет 32 бита.
и в 64 бит или общая модель LP64 (long, pointer) size_t имеет 64 бита (целые числа по-прежнему 32 бита).
Существуют и другие модели, но это те, которые используют g++ (по крайней мере по умолчанию)
visual studio — разница в C ++ между unsigned int и unsigned long int
В стандарте C ++ unsigned int
гарантированно может представлять только значения от 0
до 65535
. Практически это соответствует 16 битам. Реализации (то есть компиляторы) могут предоставлять unsigned int
с большим диапазоном, но это не обязательно.
Для сравнения, unsigned long int
гарантированно сможет представлять значения в диапазоне от 0
до 4294967295
.Практически это соответствует 32 битам. Опять же, реализация может поддерживать больший диапазон.
Диапазоны и размеры этих типов определяются реализацией. Реализация должна соответствовать минимальным требованиям и документу, который она выбирает.
Реализации нередко предоставляют unsigned int
и unsigned long int
, которые оба являются 32-битными. Или, чтобы один или оба были 64-битными. Как вы отметили, в документации по Visual Studio 2015 указано, что unsigned int
и unsigned long int
представляют значения от 0
до 4294967295
.
Для такого компилятора, как g ++, который может работать с целым рядом систем, выбор часто определяется целевой системой. Таким образом, сборка g ++ для 32-разрядной системы может поддерживать разные диапазоны для unsigned long
, чем сборка для 64-разрядной системы.
Чтобы ответить на ваши вопросы
Для беззнаковых длинных 64 бита, выходит за пределы потолка 4 294 967 295 поведение undefined или правильное поведение?
Он имеет четко определенное поведение, хотя может не дать ожидаемых результатов.Беззнаковые целые типы в C ++ используют арифметику по модулю. Целочисленное значение (типа, который может поддерживать больший диапазон), выходящее за пределы диапазона от 0
до 4294967295
, будет преобразовано так, чтобы оно находилось в этом диапазоне (математически эквивалентно многократному сложению или вычитанию 4294967296
[обратите внимание на последний цифра]). Другими словами, он будет «оборачиваться».
Если у меня есть приложение, работающее в системе Windows, скомпилированное в Visual Studio, basicall unsigned == unsigned long.Правда или ложь?
Предполагая, что Visual Studio 2015 это правда, как сказано в документации, на которую вы ссылаетесь. Это может быть, а может и не быть правдой для будущих продуктов Microsoft — это решение о реализации.
Если у меня есть приложение, скомпилированное компилятором GNU, работающим в Linux / Windows, я должен убедиться, что unsigned long == unsigned int или unsigned long == unsigned long long, чтобы избежать переполнения данных. Верно или неверно
На самом деле ложь.
Это верно только в том случае, если вы переносите код, основанный на истинности этих предположений.
Существуют методы, которые вы можете использовать, чтобы ваш код не полагался на истинность таких предположений. Например, вы можете безопасно определить, когда операция, включающая два значения без знака
переполнения или потери значимости, и в любом случае предпринять действия для получения требуемых результатов. Если все операции проверены надлежащим образом, можно избежать зависимости от конкретных размеров типов.
Если у меня есть кроссплатформенное приложение, которое может быть скомпилировано всеми этими компиляторами Visual Studio / GNU / Clang / Intel, я должен четко классифицировать среду с помощью кучи препроцессоров, чтобы избежать переполнения данных.Верно или неверно
Не совсем так. Практически часто бывает так.
Если ваш код придерживается области стандартного C ++, существуют методы, позволяющие этого избежать (как я уже упоминал выше, с возможностью избежать зависимости от размеров беззнаковых типов).
Если ваш код использует или предоставляет оболочки для функций, которые не соответствуют стандарту C ++ (например, API Windows, функции posix, которые не входят в стандарт C ++), то это часто будет необходимо. Даже в таких случаях этого можно избежать.Например, поместите версии функции, использующие API Windows, в источник, отличный от версий, использующих posix. И настройте процесс сборки (файл makefile и т. Д.) — например, при сборке для Windows не компилируйте и не связывайте версии unix.
длинное беззнаковое и битовое программирование
Сообщение от KCfromNC
Я их читал. Я хотел сказать, что весь их подход к оптимизации — обратный. Лучше всего вы получаете от лучших алгоритмов, а не от добавления или вычитания здесь или там.Как я уже сказал, эта страница представляет собой хороший сборник мелочей, которые больше относятся к соревнованиям по запутанному коду, чем к чему-либо, что вы должны использовать для реальной оптимизации реального кода. Это интересные уловки — точно так же, как написать программу, которая будет выводить сама себя, — это изящный трюк. Однако это не то, что я когда-либо хотел бы иметь рядом с производственным программным обеспечением, за исключением действительно крайних случаев. Мышление, которое заставляет людей думать, что это оптимизации, — это то же мышление, которое заставляет людей использовать однобуквенные имена переменных, потому что они будут быстрее — i.е. совсем не то, что на самом деле представляет собой анализ производительности.
Любой инструмент в чужих руках грозит неприятностями. Насколько я могу видеть немного правды в вышеизложенном, я собираюсь сыграть в этом адвоката дьявола …
Ясно, что вы не встраиваемый программист. Такие вещи могут быть неоценимы при программировании устройств с очень маленькими ОЗУ и скоростями процессора, измеряемыми в мегагерцах. Подумайте о таких устройствах, как преобразователи USB в RS232. Использование «уловок», подобных тем, что есть на замечательном сайте Bit Twiddling Hacks, для расчета паритета может стать разницей между успешным продуктом и чем-то, что нереально.
Это актуально не только для встроенных устройств. Такие вещи, как шахматный ИИ, являются одной из областей, которые, как известно, нуждаются в максимальной оптимизации, насколько это возможно, чтобы получить хороший уровень «навыков ИИ». Если бы не битборды и различные другие оптимизации, у нас практически не было бы шахматного ИИ.
Решение судоку — еще одна игра, в которой подобные «хаки» могут иметь огромное значение.
А как насчет написания библиотеки bigint. Вы хотите попробовать написать один из них без такой низкоуровневой оптимизации? Удачи вам в получении достойной производительности.Современные методы шифрования и так достаточно медленны.
Эти — это вещи типа , которые используются в реальном производственном программном обеспечении. Вы можете поспорить, что некоторые из лучших игр используют такие низкоуровневые оптимизации. Они могут даже не использовать их напрямую, так как часто наиболее подходящее место для подобных вещей находится в какой-то многоразовой библиотеке (например, в библиотеке bigint).
Да, есть идиоты, которые используют своп XOR, а это просто бессмысленный мусор. Всегда подчеркивайте разницу между «оптимизацией» и очевидной реализацией.Да, это не ваша обычная повседневная оптимизация, но вы были бы дураком, если бы намеренно отбросили их в сторону и никогда не использовали их, когда подходящее время действительно придет.
Понимание того, как работают некоторые из этих сумасшедших низкоуровневых оптимизаций, на самом деле открывает глаза, и некоторые из них переходят к высокоуровневым оптимизациям, если задуматься. Он учит вас параллелизму и таблицам поиска и, что наиболее важно, заставляет вас задуматься о том, что некоторые из способов, которыми вы могли думать о чем-то ранее, были более сложными, чем они должны быть.Я думаю, что изучение некоторых из них — жизненно важная часть карьеры программиста.
Целочисленные константы
Целочисленные константы
Целочисленные константы могут быть десятичными (основание 10), шестнадцатеричными (основание 16), двоичными (основание 2) или восьмеричными (основание 8). В отсутствие каких-либо замещающих суффиксов тип данных целочисленной константы является производным от ее значения.
Длинные и беззнаковые суффиксы
Суффикс L
(или l
), присваиваемый любым постоянным силам, эта константа должна быть представлена как длинной
.Точно так же суффикс U
(или u
) заставляет константу быть без знака
.
Суффиксы L
и U
могут использоваться с одной и той же константой в любом порядке и в любом случае: ul
, Lu
, UL
и т. Д.
Кроме того, существуют суффиксы ULL
(или ull
) и LL
(или ll
), которые заставляют константу иметь тип unsigned long long
или long long
.
При отсутствии суффикса ( U
, u
, L
, l
, LL
, ll
, ULL
или ull
),
константе присваивается «наименьший» из следующих типов, которые могут вместить ее значение: short
, unsigned short
, int
, unsigned int
, long int
, unsigned long int
, long long
или беззнаковый длинный длинный
.
В противном случае:
- Если константа имеет суффикс
U
, ее тип данных будет первым из следующего, который может вместить ее значение:unsigned short
,unsigned int
,unsigned long int
. - Если константа имеет суффикс
L
, ее тип данных будет первым из следующего, который может вместить ее значение:long int
,unsigned long int
. - Если константа имеет суффиксы
L
иU
(LU
илиUL
), ее тип данных будетunsigned long int
. - Если константа имеет
LL
, ее тип данных будетlong long
. - Если константа имеет
ULL
, ее тип данных будетunsigned long long
.
десятичный
Допускаются десятичные константы от -9223372036854775808 до 18446744073709551615. Константы, превышающие эти границы, приведут к ошибке «Вне диапазона». Десятичные константы не должны использовать начальный ноль. Целочисленная константа с начальным нулем интерпретируется как восьмеричная константа.Таким образом,
int i = 10; / * десятичное 10 * / int i = 010; / * десятичное 8 * / int я = 0; / * десятичный 0 = восьмеричный 0 * /
В отсутствие каких-либо замещающих суффиксов тип данных десятичной константы является производным от ее значения, как показано ниже:
Значение, присвоенное константе | Предполагаемый тип |
---|---|
<-9223372036854775808 | Ошибка: вне допустимого диапазона! |
-9223372036854775808-2147483649 | длинный длинный |
-2147483648 — -32769 | длинный |
-32768 — -129 | внутренний |
-128-127 | короткий |
128–255 | беззнаковый короткий |
256-32767 | внутренний |
32768-65535 | целое число без знака |
65536-2147483647 | длинный |
2147483648-4294967295 | беззнаковое длинное |
4294967296-18446744073709551615 | беззнаковый длинный длинный |
> 18446744073709551615 | Ошибка: вне допустимого диапазона! |
Шестнадцатеричный
Все константы, начинающиеся с 0x
(или 0X
), считаются шестнадцатеричными.В отсутствие каких-либо замещающих суффиксов тип данных шестнадцатеричной константы выводится из ее значения в соответствии с правилами, представленными выше. Например, 0xC367
будет рассматриваться как unsigned int
.
двоичный
Все константы, начинающиеся с 0b
(или 0B
), считаются двоичными. В отсутствие каких-либо замещающих суффиксов тип данных двоичной константы выводится из ее значения в соответствии с правилами, представленными выше.Например, 0b11101
будет рассматриваться как короткий
.
восьмеричное
Все константы с начальным нулем считаются восьмеричными. Если восьмеричная константа содержит недопустимые цифры 8 или 9, выдается сообщение об ошибке. В отсутствие каких-либо замещающих суффиксов тип данных восьмеричной константы выводится из ее значения в соответствии с правилами, представленными выше. Например, 0777
будет рассматриваться как int
.
Copyright (c) 2002-2012 микроЭлектроника.Все права защищены.
Что вы думаете об этой теме? Отправьте нам отзыв!
Хотите больше примеров и библиотек?
Найдите их на
Максимальное значение unsigned long long int в C ++
В этой статье мы обсудим тип данных unsigned long long int в C ++. Это самый большой (64-битный) целочисленный тип данных в C ++.
Вот некоторые свойства типа данных unsigned long long long int:
- Тип данных без знака хранит только положительные значения.
- Требуется размер 64 бит.
- Максимальное целочисленное значение, которое может быть сохранено в типе данных unsigned long long long int: 18, 446, 744, 073, 709, 551, 615, около 2 64 — 1 (но зависит от компилятора) .
- Максимальное значение, которое может быть сохранено в unsigned long long int, сохраняется как константа в заголовочном файле
, значение которого можно использовать как ULLONG_MAX . - Минимальное значение, которое может быть сохранено в unsigned long long int, равно нулю.
- В случае переполнения или потери значимости типа данных, значение переносится по кругу. Например, если 0 хранится в типе данных unsigned long long long int и из него вычитается 1 , значение в этой переменной станет равным 18, 446, 744, 073, 709, 551, 615. Точно так же в случае переполнения значение округляется до 0 .
Ниже приведена программа для получения максимального значения, которое может быть сохранено в unsigned long long int в C ++:
C ++
|
Выход:
Значение из климатической константы: 18446744073709551615 Значение с использованием свойства обтекания: 18446744073709551615
Home / Руководство пользователя компилятора 10.2 Основные типы данных в ARM C и C ++Описывает основные типы данных, реализованные в ARM C и C ++: Размер и выравнивание основных типов данных В следующей таблице указаны размеры Таблица 10-2 Размер и соответствие типов данных
Выравнивание типов зависит от контекста:
Целое число Целые числа представлены в виде дополнения до двух. Низкий ПоплавокВеличины с плавающей запятой хранятся в формате IEEE: Для Массивы и указатели Следующие утверждения применяются ко всем указателям на объекты.
|
5.3. Тип данных «указатель на»
5.3.
Тип данных «указатель на»
Операнды и
, за которыми следует имя переменной
возвращает свой адрес памяти. Тип данных результата - «указатель.
to », за которым следует тип используемой переменной.Правило получения
синтаксис и значение этих типов данных:
Для каждого типа данных
T
существует
существует тип данных под названием «Указатель на Т», определенный как
«Т *
».
В следующей таблице последствия применения этого
правила для основных типов данных C показаны вместе с некоторыми примерами
объявления переменных.
Тип Т | Размер (байты) | Указатель на T | Размер (байты) | Пример использования |
---|---|---|---|---|
внутр | 4 | внутр * | 4 | внутр * a, * b, * c; |
целое число без знака | 4 | целое число без знака * | 4 | целое число без знака * d, * e, * f; |
короткий внутренний | 2 | короткий внутренний * | 4 | короткий внутренний * g, * h, * i; |
unsigned short int | 2 | unsigned short int * | 4 | unsigned short int * j, * k, * l; |
длинный int | 4 | длинный int * | 4 | длинный int * m, * n, * o; |
длинное целое без знака | 4 | длинное целое без знака * | 4 | длинное целое без знака * p, * q, * r; |
char | 1 | char * | 4 | char * s, * t; |
символ без знака | 1 | символ без знака * | 4 | символ без знака * u, * v; |
с плавающей запятой | 4 | с плавающей запятой * | 4 | с плавающей запятой * w, * x; |
двойной | 8 | двойной * | 4 | двойной * y, * z; |
длинный двойной | 8 | длинный двойной * | 4 | длинный двойной * a1, * a2; |
Дополнительно к указателям на созданные типы данных, C
позволяет объявить универсальный указатель типа void *
.Переменная
этого типа хранит указатель на любые данные. Рекомендуется ограничить
использование этого типа только тогда, когда нет другого варианта.
Размер указателей всегда один и тот же независимо от
данные, на которые они указывают, потому что все они хранят адрес памяти. На случай, если
структуры данных, правило применяется точно так же. Следующий пример
показывает, как определяется структура, а также переменная и указатель на нее.
объявлена структура:
Переменная contact1
является структурированным типом и
занимает 44 байта (20 + 20 + 4), а contactPointer
имеет
указатель типа и занимает всего 4 байта.
5.3.1.
Вопросы для самооценки
имя | выражает | возможное значение * | ||
---|---|---|---|---|
CHAR_BIT | Число битов в объекте char или (байт) больше * | |||
SCHAR_MIN | Минимальное значение для объекта типа знаковый символ | -127 (-2 7 +1 ) или меньше * | ||
Максимальное значение для объекта типа signed char | 127 ( 2 7 -1 ) или больше * | |||
UCHAR_MAX | Максимальное значение для объекта типа unsigned char | 255 ( 2 8 -1 ) или выше * | ||
CHAR_MIN | Минимальное значение для объекта типа char | либо SCHAR_MIN , либо 0 | ||
CHAR_MAX | Максимальное значение для объекта типа char | SCHAR_MAX 9123_MAX 9127MAX | 1 или выше * | |
SHRT_MIN | Минимальное значение для объекта типа short int | -32767-20004 ( | ||
SHRT_MAX | Максимальное значение для объекта типа short int | 32767 ( 2 15 -1 | ||
USHRT_MAX | Максимальное значение для объекта типа unsigned short int | 6553 5 ( 2 16 -1 ) или больше * | ||
INT_MIN | Минимальное значение для объекта типа int | -32767 (-2 15 ) или меньше * | ||
INT_MAX | Максимальное значение для объекта типа int | 32767 ( 2 15 -1 ) или больше * | UINT Максимальное значение для объекта типа unsigned int | 65535 ( 2 16 -1 ) или больше * |
LONG_MIN | Минимальное значение для объекта типа 9025 long int | -2147483647 (-2 31 +1 ) или меньше * | ||
LONG_MAX | Максимальное значение для объекта типа long int | 2147483647 ( 2 31 -1 ) или выше * | ||
ULONG_MAX | Максимальное значение для объекта типа unsigned long int | 42949367295 | ||
LLONG_MIN | Минимальное значение для объекта типа long long int | -9223372036854775807 (-2 63 * | Максимальное значение для объекта типа long long int | 9223372036854775807 ( 2 63 -1 ) или более * |
ULLON для объекта 7 ULLO тип беззнаковый длинный длинный int | 18446744073709551615 ( 2 64 -1 ) или выше * |
.