Как преобразовать значение в -128
в 127
в диапазоне от 0
до 255
.Представлять знак знака в диапазоне значений без знака в C
У меня есть значение в знакомой переменной. Мне нужно напечатать преобразованное значение с неподписанной переменной.
Как преобразовать значение в -128
в 127
в диапазоне от 0
до 255
.Представлять знак знака в диапазоне значений без знака в C
У меня есть значение в знакомой переменной. Мне нужно напечатать преобразованное значение с неподписанной переменной.
Предполагая, что информация, предоставленная вами все, что нам нужно, то просто добавьте 128
к signed
переменной и сохранить его unsigned
переменную
для, например,
s.v = -50
u.v = 128 + s.v
u.v = 78
Спасибо roboboykm..got моя программа работает правильно .. – Basha
Ваш вопрос не является достаточно точным: превращение [-128..127]
в [0..255]
может быть сделано по-разному.
вы хотите сохранить значения в диапазоне 0..127
и преобразовывать отрицательные значения в диапазоне 128..255
ли? Это легко сделать с помощью простого значения: (unsigned char)
или (uint8_t)
.
вы хотите конвертировать -128
в 0
, -127
к 1
... до 127
в 255
ли? Просто добавьте 128
к значению, подписанному.
#include <stdio.h>
#define MAX (255)
unsigned char convert(signed char sv)
{
unsigned char x;
x = (unsigned char)(sv + 128);
}
int main(void) {
signed char sv = -128;
unsigned char uv = 0;
uv = convert(sv);
print("converted value = %d", uv);
}
Здесь стоит упомянуть несколько вещей. Во-первых, этот код не компилируется, поскольку вы используете 'print()' вместо 'printf()'. Кроме того, функция 'convert()' не возвращает значение, приводящее к неопределенному поведению. См. Мой ответ для более подробной информации. –
Оказывается, что ОП хочет конвертировать из signed char
в unsigned char
. Это подтверждается в ответе, представленной OP:
#include <stdio.h>
#define MAX (255)
unsigned char convert(signed char sv)
{
unsigned char x;
x = (unsigned char)(sv + 128);
}
int main(void) {
signed char sv = -128;
unsigned char uv = 0;
uv = convert(sv);
print("converted value = %d", uv);
}
Обратите внимание, что convert()
должен возвращать unsigned char
значение, но не возвращает никакого значения в коде выше. Это явно упоминается как вызывающее неопределенное поведение в стандарте: § 6.9.1 12.
Глядя мимо фундаментальные проблемы коды, то есть, значения не возвращается из функции convert()
и использование print()
вместо printf()
, может возникнуть вопрос о возможном переполнении целого.
Конечно, выше решение будет работать для sv = -128
, точнее, sv = SCHAR_MIN
и SCHAR_MAX+1
вместо 128
, но что если бы мы имели sv = SCHAR_MAX
или даже sv = 0
? Казалось бы, значение SCHAR_MAX + SCHAR_MAX+1
находится за пределами диапазона signed char
, равно 0 + SCHAR_MAX+1
, и такое переполнение приведет к неопределенному поведению.
код сохраняется здесь целыми поощрений, которые говорят, что:
Следующие могут быть использованы в выражении везде, где INT или без знака INT может быть использован:
- Объект или выражение с целым типом (кроме int или unsigned int), целочисленный ранг преобразования которого меньше или равен ранг int и unsigned int.
- Битовое поле типа _Bool, int, signed int или unsigned int.
Если INT может представлять все значения исходного типа (как ограниченная по ширине, для битового поля), значение преобразуется в Int; в противном случае он преобразуется в беззнаковый int. Они называются целыми рекламными акциями .
Так, sv
повышается до int
в выражении sv + 128
, и полученное значение является int
. Нет возможности переполнения целых чисел здесь, если char
s на самом деле int
s, что означает, что SCHAR_MAX
- это то же самое, что и INT_MAX
(этот - возможность, однако маловероятная).
Значение, полученное в результате sv + 128
, затем преобразуется в unsigned char
и, предположительно, возвращается к вызывающей функции. Но бросок не нужен здесь, так как тип результата будет конвертирован в unsigned char
Перед назначением:
C11 Draft Standard §6.5.16.1 2
В простом присваивании (=), то значение правого операнда преобразуется в тип выражения присваивания и заменяет сохраненное значение в объекте, обозначенном левым операндом.
Но даже назначение ненужно здесь, так как значение выражения преобразуется в unsigned char
в return
заявление:
Если оператор возврата с выражением выполняется, значение выражения возвращается вызывающему в качестве значения вызова функции . Если выражение имеет тип, отличный от возвращаемого типа функции, в котором он появляется, значение преобразуется как путем назначения объекту, имеющему тип возврата функции.
Таким образом, пользуясь целым поощрений и преобразование типа возвращаемого значения, функция convert()
может быть упрощена:
unsigned char convert(signed char sv)
{
return sv + 128;
}
Конечно, эта функция настолько минимальна, что вся программа может быть переписаны. Для максимальной переносимости следует использовать SCHAR_MAX
от limits.h
. Кроме того, спецификатор %hhu
преобразования следует использовать для печати значения в unsigned char
:
#include <stdio.h>
#include <limits.h>
int main(void) {
signed char sv = -128;
unsigned char uv = sv + SCHAR_MAX + 1;
printf("converted value = %hhu\n", uv);
}
Обратите внимание, что вы также можете просто бросить sv
к unsigned char
, или вы могли бы вместо того, чтобы полагаться на преобразовании типов присваивания, избегая явное приведение :
unsigned char uv = sv;
Этот метод работает, но дает разные результаты. Вот сравнение результатов двух методов: выход
#include <stdio.h>
#include <limits.h>
int main(void)
{
signed char sv;
unsigned char uv;
printf("Conversion by addition");
sv = SCHAR_MIN;
for (int i = 0; ; sv++, i++) {
if (i % 6 == 0) {
putchar('\n');
}
uv = sv + SCHAR_MAX + 1;
printf("%4hhd --> %-4hhu", sv, uv);
if (sv == SCHAR_MAX) break;
}
puts("\n");
printf("Conversion by casting");
sv = SCHAR_MIN;
for (int i = 0; ; sv++, i++) {
if (i % 6 == 0) {
putchar('\n');
}
/* could use uv = sv instead of (unsigned char) sv */
printf("%4hhd --> %-4hhu", sv, (unsigned char) sv);
if (sv == SCHAR_MAX) break;
}
putchar('\n');
return 0;
}
Программа:
Conversion by addition
-128 --> 0 -127 --> 1 -126 --> 2 -125 --> 3 -124 --> 4 -123 --> 5
-122 --> 6 -121 --> 7 -120 --> 8 -119 --> 9 -118 --> 10 -117 --> 11
-116 --> 12 -115 --> 13 -114 --> 14 -113 --> 15 -112 --> 16 -111 --> 17
-110 --> 18 -109 --> 19 -108 --> 20 -107 --> 21 -106 --> 22 -105 --> 23
-104 --> 24 -103 --> 25 -102 --> 26 -101 --> 27 -100 --> 28 -99 --> 29
-98 --> 30 -97 --> 31 -96 --> 32 -95 --> 33 -94 --> 34 -93 --> 35
-92 --> 36 -91 --> 37 -90 --> 38 -89 --> 39 -88 --> 40 -87 --> 41
-86 --> 42 -85 --> 43 -84 --> 44 -83 --> 45 -82 --> 46 -81 --> 47
-80 --> 48 -79 --> 49 -78 --> 50 -77 --> 51 -76 --> 52 -75 --> 53
-74 --> 54 -73 --> 55 -72 --> 56 -71 --> 57 -70 --> 58 -69 --> 59
-68 --> 60 -67 --> 61 -66 --> 62 -65 --> 63 -64 --> 64 -63 --> 65
-62 --> 66 -61 --> 67 -60 --> 68 -59 --> 69 -58 --> 70 -57 --> 71
-56 --> 72 -55 --> 73 -54 --> 74 -53 --> 75 -52 --> 76 -51 --> 77
-50 --> 78 -49 --> 79 -48 --> 80 -47 --> 81 -46 --> 82 -45 --> 83
-44 --> 84 -43 --> 85 -42 --> 86 -41 --> 87 -40 --> 88 -39 --> 89
-38 --> 90 -37 --> 91 -36 --> 92 -35 --> 93 -34 --> 94 -33 --> 95
-32 --> 96 -31 --> 97 -30 --> 98 -29 --> 99 -28 --> 100 -27 --> 101
-26 --> 102 -25 --> 103 -24 --> 104 -23 --> 105 -22 --> 106 -21 --> 107
-20 --> 108 -19 --> 109 -18 --> 110 -17 --> 111 -16 --> 112 -15 --> 113
-14 --> 114 -13 --> 115 -12 --> 116 -11 --> 117 -10 --> 118 -9 --> 119
-8 --> 120 -7 --> 121 -6 --> 122 -5 --> 123 -4 --> 124 -3 --> 125
-2 --> 126 -1 --> 127 0 --> 128 1 --> 129 2 --> 130 3 --> 131
4 --> 132 5 --> 133 6 --> 134 7 --> 135 8 --> 136 9 --> 137
10 --> 138 11 --> 139 12 --> 140 13 --> 141 14 --> 142 15 --> 143
16 --> 144 17 --> 145 18 --> 146 19 --> 147 20 --> 148 21 --> 149
22 --> 150 23 --> 151 24 --> 152 25 --> 153 26 --> 154 27 --> 155
28 --> 156 29 --> 157 30 --> 158 31 --> 159 32 --> 160 33 --> 161
34 --> 162 35 --> 163 36 --> 164 37 --> 165 38 --> 166 39 --> 167
40 --> 168 41 --> 169 42 --> 170 43 --> 171 44 --> 172 45 --> 173
46 --> 174 47 --> 175 48 --> 176 49 --> 177 50 --> 178 51 --> 179
52 --> 180 53 --> 181 54 --> 182 55 --> 183 56 --> 184 57 --> 185
58 --> 186 59 --> 187 60 --> 188 61 --> 189 62 --> 190 63 --> 191
64 --> 192 65 --> 193 66 --> 194 67 --> 195 68 --> 196 69 --> 197
70 --> 198 71 --> 199 72 --> 200 73 --> 201 74 --> 202 75 --> 203
76 --> 204 77 --> 205 78 --> 206 79 --> 207 80 --> 208 81 --> 209
82 --> 210 83 --> 211 84 --> 212 85 --> 213 86 --> 214 87 --> 215
88 --> 216 89 --> 217 90 --> 218 91 --> 219 92 --> 220 93 --> 221
94 --> 222 95 --> 223 96 --> 224 97 --> 225 98 --> 226 99 --> 227
100 --> 228 101 --> 229 102 --> 230 103 --> 231 104 --> 232 105 --> 233
106 --> 234 107 --> 235 108 --> 236 109 --> 237 110 --> 238 111 --> 239
112 --> 240 113 --> 241 114 --> 242 115 --> 243 116 --> 244 117 --> 245
118 --> 246 119 --> 247 120 --> 248 121 --> 249 122 --> 250 123 --> 251
124 --> 252 125 --> 253 126 --> 254 127 --> 255
Conversion by casting
-128 --> 128 -127 --> 129 -126 --> 130 -125 --> 131 -124 --> 132 -123 --> 133
-122 --> 134 -121 --> 135 -120 --> 136 -119 --> 137 -118 --> 138 -117 --> 139
-116 --> 140 -115 --> 141 -114 --> 142 -113 --> 143 -112 --> 144 -111 --> 145
-110 --> 146 -109 --> 147 -108 --> 148 -107 --> 149 -106 --> 150 -105 --> 151
-104 --> 152 -103 --> 153 -102 --> 154 -101 --> 155 -100 --> 156 -99 --> 157
-98 --> 158 -97 --> 159 -96 --> 160 -95 --> 161 -94 --> 162 -93 --> 163
-92 --> 164 -91 --> 165 -90 --> 166 -89 --> 167 -88 --> 168 -87 --> 169
-86 --> 170 -85 --> 171 -84 --> 172 -83 --> 173 -82 --> 174 -81 --> 175
-80 --> 176 -79 --> 177 -78 --> 178 -77 --> 179 -76 --> 180 -75 --> 181
-74 --> 182 -73 --> 183 -72 --> 184 -71 --> 185 -70 --> 186 -69 --> 187
-68 --> 188 -67 --> 189 -66 --> 190 -65 --> 191 -64 --> 192 -63 --> 193
-62 --> 194 -61 --> 195 -60 --> 196 -59 --> 197 -58 --> 198 -57 --> 199
-56 --> 200 -55 --> 201 -54 --> 202 -53 --> 203 -52 --> 204 -51 --> 205
-50 --> 206 -49 --> 207 -48 --> 208 -47 --> 209 -46 --> 210 -45 --> 211
-44 --> 212 -43 --> 213 -42 --> 214 -41 --> 215 -40 --> 216 -39 --> 217
-38 --> 218 -37 --> 219 -36 --> 220 -35 --> 221 -34 --> 222 -33 --> 223
-32 --> 224 -31 --> 225 -30 --> 226 -29 --> 227 -28 --> 228 -27 --> 229
-26 --> 230 -25 --> 231 -24 --> 232 -23 --> 233 -22 --> 234 -21 --> 235
-20 --> 236 -19 --> 237 -18 --> 238 -17 --> 239 -16 --> 240 -15 --> 241
-14 --> 242 -13 --> 243 -12 --> 244 -11 --> 245 -10 --> 246 -9 --> 247
-8 --> 248 -7 --> 249 -6 --> 250 -5 --> 251 -4 --> 252 -3 --> 253
-2 --> 254 -1 --> 255 0 --> 0 1 --> 1 2 --> 2 3 --> 3
4 --> 4 5 --> 5 6 --> 6 7 --> 7 8 --> 8 9 --> 9
10 --> 10 11 --> 11 12 --> 12 13 --> 13 14 --> 14 15 --> 15
16 --> 16 17 --> 17 18 --> 18 19 --> 19 20 --> 20 21 --> 21
22 --> 22 23 --> 23 24 --> 24 25 --> 25 26 --> 26 27 --> 27
28 --> 28 29 --> 29 30 --> 30 31 --> 31 32 --> 32 33 --> 33
34 --> 34 35 --> 35 36 --> 36 37 --> 37 38 --> 38 39 --> 39
40 --> 40 41 --> 41 42 --> 42 43 --> 43 44 --> 44 45 --> 45
46 --> 46 47 --> 47 48 --> 48 49 --> 49 50 --> 50 51 --> 51
52 --> 52 53 --> 53 54 --> 54 55 --> 55 56 --> 56 57 --> 57
58 --> 58 59 --> 59 60 --> 60 61 --> 61 62 --> 62 63 --> 63
64 --> 64 65 --> 65 66 --> 66 67 --> 67 68 --> 68 69 --> 69
70 --> 70 71 --> 71 72 --> 72 73 --> 73 74 --> 74 75 --> 75
76 --> 76 77 --> 77 78 --> 78 79 --> 79 80 --> 80 81 --> 81
82 --> 82 83 --> 83 84 --> 84 85 --> 85 86 --> 86 87 --> 87
88 --> 88 89 --> 89 90 --> 90 91 --> 91 92 --> 92 93 --> 93
94 --> 94 95 --> 95 96 --> 96 97 --> 97 98 --> 98 99 --> 99
100 --> 100 101 --> 101 102 --> 102 103 --> 103 104 --> 104 105 --> 105
106 --> 106 107 --> 107 108 --> 108 109 --> 109 110 --> 110 111 --> 111
112 --> 112 113 --> 113 114 --> 114 115 --> 115 116 --> 116 117 --> 117
118 --> 118 119 --> 119 120 --> 120 121 --> 121 122 --> 122 123 --> 123
124 --> 124 125 --> 125 126 --> 126 127 --> 127
Это довольно полный ответ. Я бы просто предложил факторинг специального случая для 'sv == SCHAR_MAX' внутри циклов, подавляя условие' sv! = SCHAR_MAX' и добавляя разрыв 'if (sv == SCHAR_MAX)' в нижней части тела цикла. – chqrlie
@ chqrlie-- Хммм. Это хорошее предложение; Я бы подумал об этом. Благодаря! –
Пожалуйста, покажите ваши усилия исследования/отладки до сих пор. Сначала прочитайте страницу [Ask]. –
Вставить в 'int' и добавить' 128' :) Если вы имели в виду что-то еще, уточните, что в вопросе – rustyx
Преобразуйте в 'int'. Добавьте результат «128». Распечатайте результат как 'int'. – Peter