Задавать вопрос
спросил
Изменено 5 месяцев назад
Просмотрено 338 тысяч раз
Я переношу код из Linux C в Visual C++ для Windows.
Visual C++ не знает #include
, поэтому я закомментировал это.
Позже я нашел много этих 'uint32_t': идентификатор не найден
ошибок. Как это решить?
Этот тип определен в заголовке C
, который является частью стандарта C++11, но не является стандартом C++03. Согласно странице Википедии в заголовке, она не поставлялась с Visual Studio до VS2010.
Тем временем вы, вероятно, могли бы подделать свою собственную версию заголовка, добавив typedef
, которые сопоставляют пользовательские целочисленные типы Microsoft с типами, ожидаемыми C. Например:
typedef __int32 int32_t; typedef без знака __int32 uint32_t; /* ... и т. д. ... */13
Вы можете #include
. Является частью стандарта C++ с 2011 года.
У меня такая же ошибка и она исправлена включив в файл следующий
#include
в начале вашего файла.
1Boost.Config предлагает эти определения типов для наборов инструментов, которые не предоставляют их изначально. Документация по этой конкретной функции находится здесь: Standard Integer Types
На странице проекта msinttypes доступна реализация — «Этот проект восполняет отсутствие stdint.h и inttypes.h в Microsoft Visual Studio».
У меня нет опыта работы с этой реализацией, но я видел, как ее рекомендовали другие на SO.
1 В Windows я обычно использую типы Windows. Чтобы использовать его, вы должны включить
.
В данном случае uint32_t — это UINT32 или просто UINT.
Определения всех типов находятся здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx
Мне пришлось запустить проект в VS2010, и я не мог внести никаких изменений в код. Мое решение состояло в том, чтобы установить vS2013 и в VS2010 указать каталоги VC++->IncludeDirectories в Program Files (x86)\Microsoft Visual Studio 12.0\VC\include. Тогда мой проект скомпилировался без проблем.
Требуется, но не отображается
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
Вероятно, вам интересно, что такое uint8_t , uint16_t , uint32_t и uint64_t .
Хороший вопрос. Потому что это может быть действительно полезно!
Получается, что они равны соответственно: unsigned char , unsigned short , unsigned int и unsigned long long .
Но что такое диапазоны всех этих типов?
Давайте проверим это в этом учебнике по C.
Мы будем использовать переменную с именем testValue , равное 0xFFFFFFFFFFFFFFFF
.Обратите внимание, что 0xFFFFFFFFFFFFFFFF совпадает с 18 , 446 , 744 9010 3, 073 , 709 , 551 615 и это максимальное значение возможно для unsigned long long , в зависимости от архитектуры вашего процессора (как сказал gineera в своем комментарии).
Не так-то просто понять все эти вещи, но продолжайте пробовать, это станет яснее после окончания этого урока. По крайней мере, я на это надеюсь.
В части кода мы увидим, что переменная number8 имеет результат 255 .
Почему? Потому что 255 — это максимальное значение unsigned char или uint8_t
Например, если бы мы добавили +1 к каждому числу ниже, мы бы получили:
0 (первое значение символа или 1 байт) 1 2 3 ... 250 251 252 253 254 255 (максимальное значение символа или 1 байта) 0 (первое значение символа или 1 байт) 1 2 3 ... до 255 (максимальное значение символа или 1 байта) 0 1 2 3 ... до 255 (максимальное значение символа или 1 байта) 0 1 2 3 и так далее.
Таким образом, мы не сможем иметь значение 256 в символе (или байте).
Если бы мы хотели иметь такое значение, нам пришлось бы использовать другой тип, например unsigned short или uint16_t равно 2 байтам или 16 битам.
Ничего себе, это все еще путать? Давай продолжим!
Действительно, с беззнаковым коротким мы сможем использовать этот тип до значения 65535 в десятичном виде
или 0xFFFF в шестнадцатеричном формате.
Но в нашем примере мы будем использовать огромное значение: 18 446 744 073 709 551 615 .
И мы получим максимальное значение каждого типа!
98) — 1 = 256 — 1 = 255.// тестовое значение unsigned long long testValue = 0xFFFFFFFFFFFFFFFFFF; // 18446744073709551615 // 1 байт -> [0-255] или [0x00-0xFF] uint8_t number8 = testValue; // 255 unsigned char numberChar = testValue; // 255 // 2 байта -> [0-65535] или [0x0000-0xFFFF] uint16_t number16 = testValue; // 65535 unsigned short numberShort = testValue; // 65535 // 4 байта ->[0-4294967295] или [0x00000000-0xFFFFFFFF] uint32_t number32 = testValue; // 4294967295 unsigned int numberInt = testValue; // 4294967295 // 8 байт -> [0-18446744073709551615] или [0x0000000000000000-0xFFFFFFFFFFFFFFFFFF] uint64_t number64 = testValue; // 18446744073709551615 unsigned long long numberLongLong = testValue; // 18446744073709551615
Теперь вы можете обращаться с битами и байтами как профессионал.