2017-02-20 4 views
-3

Как преобразовать значение в -128 в 127 в диапазоне от 0 до 255.Представлять знак знака в диапазоне значений без знака в C

У меня есть значение в знакомой переменной. Мне нужно напечатать преобразованное значение с неподписанной переменной.

+1

Пожалуйста, покажите ваши усилия исследования/отладки до сих пор. Сначала прочитайте страницу [Ask]. –

+0

Вставить в 'int' и добавить' 128' :) Если вы имели в виду что-то еще, уточните, что в вопросе – rustyx

+0

Преобразуйте в 'int'. Добавьте результат «128». Распечатайте результат как 'int'. – Peter

ответ

0

Предполагая, что информация, предоставленная вами все, что нам нужно, то просто добавьте 128 к signed переменной и сохранить его unsigned переменную

для, например,

s.v = -50 

u.v = 128 + s.v 

u.v = 78 
+0

Спасибо roboboykm..got моя программа работает правильно .. – Basha

1

Ваш вопрос не является достаточно точным: превращение [-128..127] в [0..255] может быть сделано по-разному.

  • вы хотите сохранить значения в диапазоне 0..127 и преобразовывать отрицательные значения в диапазоне 128..255 ли? Это легко сделать с помощью простого значения: (unsigned char) или (uint8_t).

  • вы хотите конвертировать -128 в 0, -127 к 1 ... до 127 в 255 ли? Просто добавьте 128 к значению, подписанному.

0
#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); 
    } 
+0

Здесь стоит упомянуть несколько вещей. Во-первых, этот код не компилируется, поскольку вы используете 'print()' вместо 'printf()'. Кроме того, функция 'convert()' не возвращает значение, приводящее к неопределенному поведению. См. Мой ответ для более подробной информации. –

1

Оказывается, что ОП хочет конвертировать из 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, и такое переполнение приведет к неопределенному поведению.

код сохраняется здесь целыми поощрений, которые говорят, что:

C11 Draft Standard §6.3.1.1 2

Следующие могут быть использованы в выражении везде, где 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 заявление:

C11 Draft Standard §6.8.6.4 3

Если оператор возврата с выражением выполняется, значение выражения возвращается вызывающему в качестве значения вызова функции . Если выражение имеет тип, отличный от возвращаемого типа функции, в котором он появляется, значение преобразуется как путем назначения объекту, имеющему тип возврата функции.

Таким образом, пользуясь целым поощрений и преобразование типа возвращаемого значения, функция 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 
+0

Это довольно полный ответ. Я бы просто предложил факторинг специального случая для 'sv == SCHAR_MAX' внутри циклов, подавляя условие' sv! = SCHAR_MAX' и добавляя разрыв 'if (sv == SCHAR_MAX)' в нижней части тела цикла. – chqrlie

+0

@ chqrlie-- Хммм. Это хорошее предложение; Я бы подумал об этом. Благодаря! –

Смежные вопросы