Расхождения в расчетах

У меня что-то вроде этого в С #

        byte a;
        byte b;
        byte c;

        c = a + b;

и он выдает ошибку для c = a + b и говорит: «Невозможно неявно преобразовать тип 'int' в 'byte'. Существует явное преобразование (вы пропустили приведение?). Я не понимаю, почему, потому что все в байтах

Matlab участвует, потому что я перевожу программу обработки изображений из Matlab в C #, где я беру значения из изображения, которое является uint8, и выполняю вычисления с этим значением, когда оно это делает, unit8 берет на себя, и во время любых вычислений устанавливается любое число выше 255 до 255. Итак, в C # я просто сделал все свои переменные байтами, так как все они в любом случае меньше 255, но, как и в примере кода, при выполнении вычислений выскакивает ошибка.


person IkeJoka    schedule 11.07.2013    source источник
comment
Нет оператора + с байтами - см. stackoverflow.com/questions/941584/byte-byte-int-why   -  person Gray    schedule 11.07.2013
comment
Взгляните на эту ссылку stackoverflow.com/questions/941584/byte-byte-int-why за ответ   -  person Sriram Sakthivel    schedule 11.07.2013
comment
как указано в предоставленной ссылке, я действительно пытался использовать их раньше, но расчет, который я получаю в С #, не такой, как в Matlab   -  person IkeJoka    schedule 11.07.2013
comment
но вычисление, которое я получаю в С #, не то же самое, что я получаю в Matlab - если бы только у нас были некоторые значения для использования ...   -  person Austin Salonen    schedule 11.07.2013


Ответы (2)


Во время любых вычислений любое число больше 255 устанавливается равным 255.

Это не поддерживается изначально в C #. Вместо этого по умолчанию приведение (byte) принимает младший значащий байт, давая арифметический результат, эквивалентный по модулю 256.

c = unchecked((byte)(200 + 200));

Результатом выше будет 144, что эквивалентно 400 % 256.

Если вы хотите обрезать результаты на 255, вам нужно указать это явно:

c = (byte)Math.Min(a + b, 255);
person Douglas    schedule 11.07.2013
comment
если у меня длинная строка вычислений, мне нужно преобразовать каждый из них в байты, поэтому вместо (byte) (a + b) * (c + d) он должен быть (byte) (a + b) * (byte) (c + d) - person IkeJoka; 11.07.2013
comment
@ user2521432: Я полагаю, вы хотите выполнить приведение в конце: (byte)((a+b)*(c+d)). - person Douglas; 11.07.2013
comment
но будет ли он выполнять эту максимальную операцию в конце вычисления, или, если у меня есть куча более мелких вычислений в одной строке, он также будет обрезать каждый из них на 255? потому что это то, что он делает в Matlab - person IkeJoka; 11.07.2013
comment
@ user2521432: Операция Min будет применяться везде, где вы ее явно вставляете. Для приведенного вами примера это не имеет значения, но если бы у вас были вычитания и деления, вам нужно было бы использовать его при каждом вычислении, чтобы получить результаты, согласующиеся с тем, что вы описали. Например, 200+200-100 должно быть выражено как Math.Min(Math.Min(200+200,255)-100,255), что даст 155. - person Douglas; 11.07.2013

Арифметическое выражение в правой части оператора присваивания по умолчанию принимает значение int.

См. байт - MSDN

Следующий оператор присваивания вызовет ошибку компиляции, потому что арифметическое выражение в правой части оператора присваивания по умолчанию оценивается как int.

byte x = 10, y = 20;
byte z = x + y;   // Error: conversion from int to byte

При добавлении явного приведения ошибка будет выглядеть так:

byte z = (byte)(x + y);   
person Habib    schedule 11.07.2013
comment
как указано в предоставленной ссылке, я действительно пытался использовать их раньше, но расчет, который я получаю в С #, не такой, как в Matlab - person IkeJoka; 11.07.2013