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 ++

#include

#include

с использованием пространства имен std;

int main ()

{

без знака значение без знака = ULLONG_MAX;

cout << "Значение из климов"

<< "константа:" ;

cout << valueFromLimits << "\ n" ;

без знака long 0 long int значение int значение

значение = значение - 1;

cout << "Значение с использованием обтекания"

<< "вокруг собственности:"

<< значение << "\ n" ;

возврат 0;

}

Выход:

Значение из климатической константы: 18446744073709551615
Значение с использованием свойства обтекания: 18446744073709551615
 

Базовые типы данных в ARM C и C ++

Home / Руководство пользователя компилятора

10.2 Основные типы данных в ARM C и C ++

Описывает основные типы данных, реализованные в ARM C и C ++:

Размер и выравнивание основных типов данных

В следующей таблице указаны размеры
и естественное выравнивание основных типов данных.

Таблица 10-2 Размер и соответствие типов данных

Тип Размер в битах Естественное выравнивание в байтах Диапазон значений
знак 8 1 (с выравниванием по байтам)

По умолчанию от 0 до 255 (без знака).

от –128 до 127 (со знаком) при компиляции с --signed_chars .

символ со знаком 8 1 (с выравниванием по байтам)

–128 до 127

символ без знака 8 1 (с выравниванием по байтам)

0 до 255

(подпись) короткая 16 2 (с выравниванием по полуслову) –32 768 до 32 767
короткое беззнаковое 16 2 (с выравниванием по полуслову) 0 до 65 535
(со знаком) внутр 32 4 (с выравниванием по словам) –2 147 483 648 до 2 147 483 647
целое число без знака 32 4 (с выравниванием по словам) 0 до 4 294 967 295
(подписанный) длинный 32 4 (с выравниванием по словам) –2 147 483 648 до 2 147 483 647
длинное беззнаковое 32 4 (с выравниванием по словам) 0 до 4 294 967 295
(со знаком) длинный длинный 64 8 (с выравниванием по двойному слову) –9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
беззнаковый длинный длинный 64 8 (с выравниванием по двойному слову) 0 до 18 446 744 073 709 551 615
с плавающей запятой 32 4 (с выравниванием по словам) 1.175494351e-38 до 3.40282347e + 38 (нормализованные значения)
двойной 64 8 (с выравниванием по двойному слову) 2.22507385850720138e-308 до 1.79769313486231571e + 308 (нормализованные значения)
длинный двойной 64 8 (с выравниванием по двойному слову) 2.22507385850720138e-308 к 1.79769313486231571e + 308 (нормализованные значения)
wchar_t

16

32

2 (с выравниванием по полуслову)

4 (с выравниванием по словам)

По умолчанию от 0 до 65 535.

0 до 4,294,967,295 при компиляции с --wchar32 .

Все указатели 32 4 (с выравниванием по словам) Не применимо.
bool (только C ++) 8 1 (с выравниванием по байтам) ложь или правда
_Bool (только C a ) 8 1 (с выравниванием по байтам) ложь или правда

Выравнивание типов зависит от контекста:

  • Локальные переменные обычно хранятся в регистрах, но
    когда локальные переменные попадают в стек, они всегда выравниваются по словам.Например, разлитая локальная переменная char имеет
    выравнивание 4.

  • Естественное выравнивание упакованного типа 1.

Целое число

Целые числа представлены в виде дополнения до двух. Низкий
слово long long находится по младшему адресу в
в режиме прямого порядка байтов и по старшему адресу в режиме прямого порядка байтов.

Поплавок

Величины с плавающей запятой хранятся в формате IEEE:

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

Массивы и указатели

Следующие утверждения применяются ко всем указателям на объекты.
в C и C ++, кроме указателей на члены:

  • Соседние байты имеют адреса
    которые отличаются на один.

  • Макрос NULL расширяется до
    значение 0.

  • Преобразование между целыми числами и указателями приводит к
    без изменения представительства.

  • Компилятор предупреждает о приведениях между указателями на
    функции и указатели на данные.

  • Тип size_t определяется как без знака
    int
    .

  • Определен тип ptrdiff_t
    как подписанный int .

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.

Вопросы для самооценки

(limits.h) - Ссылка C ++

SCHAR_MAX 9125_MAX 912EN_MAX 912EN_ 9125 Максимальное количество байтов в многобайтовом символе для любого языкового стандарта

) или больше *

28

имя выражает возможное значение *
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 (-3276720004 (-3276720004 15 +1 ) или меньше *
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 8 ) или больше *
LLONG_MIN Минимальное значение для объекта типа long long int -9223372036854775807 (-2 63 *

58 или менее 63 *

58) LLONG_MAX

Максимальное значение для объекта типа long long int 9223372036854775807 ( 2 63 -1 ) или более *
ULLON для объекта 7 ULLO тип беззнаковый длинный длинный int 18446744073709551615 ( 2 64 -1 ) или выше *

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *