Это одна из причин, по которой C ++ ввел новый стиль приведения, который включает static_cast
и reinterpret_cast
Есть две вещи, которые вы можете иметь в виду, говоря, что преобразование из подписанного в неподписанное означает, что вы хотите, чтобы переменная без знака содержала значение переменной со знаком по модулю максимального значения вашего типа без знака + 1. То есть, если вы подписали char имеет значение -128, затем CHAR_MAX+1
добавляется для значения 128, а если оно имеет значение -1, то CHAR_MAX+1
добавляется для значения 255, это то, что делает static_cast. С другой стороны, вы можете интерпретировать значение бита памяти, на которую ссылается какая-либо переменная, для интерпретации как байт без знака, независимо от целочисленного представления со знаком, используемого в системе, т. Е. Если оно имеет значение бита 0b10000000
, его следует оценить до значения 128 и 255 для значения бита 0b11111111
, это достигается с помощью reinterpret_cast.
Теперь, для представления дополнения к двум, это происходит в точности одно и то же, поскольку -128 представляется как 0b10000000
, а -1 представляется как 0b11111111
и аналогично для всех между ними. Однако другие компьютеры (обычно более старые архитектуры) могут использовать другое представление со знаком, такое как знак и величина или дополнение. В дополнение к ним значение бита 0b10000000
будет не -128, а -127, поэтому статическое приведение к unsigned char сделает это 129, в то время как reinterpret_cast сделает это 128. Кроме того, в дополнение к значению бита 0b11111111
не будет -1, но -0 (да, это значение существует в дополнении) и будет преобразовано в значение 0 с static_cast, но в значение 255 с reinterpret_cast. Обратите внимание, что в случае дополнения единиц значение без знака 128 фактически не может быть представлено в знаке со знаком, поскольку оно варьируется от -127 до 127 из-за значения -0.
Я должен сказать, что подавляющее большинство компьютеров будет использовать двоичное дополнение делает весь выпуск спорным для почти в любом месте вашего кода будет когда-либо бежать. Вероятно, вы когда-нибудь увидите системы с чем-то, кроме двух, в очень старых архитектурах, подумайте, временные рамки 60-х годов.
Синтаксис сводится к следующему:
signed char x = -100;
unsigned char y;
y = (unsigned char)x; // C static
y = *(unsigned char*)(&x); // C reinterpret
y = static_cast<unsigned char>(x); // C++ static
y = reinterpret_cast<unsigned char&>(x); // C++ reinterpret
Чтобы сделать это хорошим способом C ++ с массивами:
jbyte memory_buffer[nr_pixels];
unsigned char* pixels = reinterpret_cast<unsigned char*>(memory_buffer);
или путь C:
unsigned char* pixels = (unsigned char*)memory_buffer;