2013-07-11 6 views
0

j'ai quelque chose comme ça en C#différences de calcul

 byte a; 
     byte b; 
     byte c; 

     c = a + b; 

et il donne une erreur pour c = a + b et dit: « Impossible de convertir implicitement le type « int » à « octet ». Une conversion explicite existe (Matlab est impliqué parce que je traduis un programme de traitement d'image de matlab en C# où je prends des valeurs d'une image qui sont uint8 et en train de faire calculs avec cette valeur quand il le fait l'unit8 prend le relais et pendant tous les calculs tout nombre supérieur à 255 est fixé à 255. Donc, dans C# je viens de faire tout mes octets de variables, car ils sont tous de moins de 255 mais de toute façon, comme dans le code d'exemple lors de l'exécution des calculs, l'erreur apparaît.

+1

Il n'y a pas opérateur + avec des octets - voir http://stackoverflow.com/questions/941584/byte-byte -int-pourquoi – Gray

+0

Jetez un coup d'oeil à ce lien http://stackoverflow.com/questions/941584/byte-byte-int-why pour la réponse –

+0

comme le lien fourni a dit, j'ai effectivement jeté essayer de les jeter avant, mais le calcul que je reçois en C# n'est pas le même que celui que j'obtiens en matlab –

Répondre

0

Au cours des calculs un nombre plus élevé que 255 est fixé à 255.

C'est non supporté nativement en C#. Au lieu de cela, le comportement par défaut de la distribution (byte) est de prendre le moins significatif octet, ce qui donne un résultat arithmétique équivalent à modulo 256.

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

Le résultat ci-dessus sera 144, ce qui équivaut à 400 % 256.

Si vous voulez couper les résultats à 255, vous devez spécifier explicitement:

c = (byte)Math.Min(a + b, 255); 
+0

si j'ai une longue chaîne de calculs dois-je lancer chacun d'eux en octets donc au lieu de (octet) (a + b) * (c + d) il devrait être (octet) (a + b) * (octet) (c + d) –

+0

@ user2521432: Je suppose que vous voulez lancer à la fin: '(octet) ((a + b) * (c + d)) '. – Douglas

+0

mais est-ce que ça va faire l'opération max à la fin de la calculaiton ou si j'ai un tas de calculs plus petits sur une ligne, est-ce que ça va aussi les découper à 255?parce que c'est ce que cela fait dans matlab –

1

L'expression arithmétique sur le côté droit de l'opérateur d'affectation est évaluée à int par défaut.

Voir byte - MSDN

L'instruction d'affectation suivante produira une erreur de compilation, parce que l'expression arithmétique sur la droite de l'opérateur d'affectation évalue int par défaut.

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

En ajoutant un casting explicite l'erreur va comme:

byte z = (byte)(x + y); 
+0

comme le lien fourni dit, j'ai effectivement essayé de lancer pour les lancer avant, mais le calcul que je reçois en C# n'est pas le même que celui que j'obtiens dans matlab –

Questions connexes