C:比较两个字节以查看一个是否在另一个的某个范围内

时间:2009-12-16 21:11:31

标签: c byte

我正在编写代码,比较代表整数的2个字节。我想看看字节R是否与G的+ -10相同。我对代码的问题是在结尾附近的if-statment中进行比较。字节永远不会超出范围,即使它们应该。我确定问题来自于我如何添加/减去error_range,但我不知道有任何其他方法可以做到这一点。

我首先考虑将字节转换为整数但我在网上找不到任何帮助。如果这比我在这里做的更好,请告诉我该怎么做。

感谢任何帮助!

const char ERROR_RANGE = 0x1010; //warning: overflow in implicit constant conversion
char R, G; /2 separate bytes
char buffer; //enough space for 1 byte

image = fopen(fileName,"r"); //open file

fread(&buffer, 1, 1, image); //read 1 byte  
memcpy (&R,&buffer,1); //store it as R

fread(&buffer, 1, 1, image); //read 1 byte   
memcpy (&G,&buffer,1); //store it as G

fclose(image);

if((R >= (G + ERROR_RANGE)) && (R <= (G - ERROR_RANGE)))
{
    printf("Outside of range!\n");
}

感谢。

5 个答案:

答案 0 :(得分:11)

您的问题是因为您的测试说:

  

if(R大于或等于G + ERROR)AND(R小于或等于G - ERROR)

它不可能都是。

在第一个实例中将&&替换为||

更好的测试是:

  

if(R和G之差大于ERROR)

转换为:

if (abs(R - G) > ERROR_RANGE)
{
    printf("Error");
}

答案 1 :(得分:6)

第一个问题是您使用的是&&,而不是||。 R不会太高也不会太低。

其次,你确定R和G在合理的范围内吗?如果您的系统上的char是未签名的,那么如果G很小而不是小的那么G - ERROR_RANGE可能是一个很大的数字。 你可能最喜欢if (abs(R - G) <= ERROR_RANGE)

答案 2 :(得分:3)

除了已经指出的内容......

值0x1010太大而不适合一个字节,两个字节永远不会超过255(0xff)。你的意思是1010 二进制(== 10十进制== 0xA十六进制)?

此外,无需阅读和复制,您可以直接读取变量:

fread(&R, 1, 1, image); //read 1 byte  
fread(&G, 1, 1, image); //read 1 byte   

答案 3 :(得分:2)

是否有某些原因你无法使用:

if (abs(R-G) > ERROR_RANGE)
    // ...

答案 4 :(得分:1)

这是我对它的刺痛,未经测试:

unsigned char buffer[2];
int r, g, diff;

image = fopen(fileName, "r");
fread(&buffer, 2, 1, image);

r = buffer[0];
g = buffer[1];
dif = r - g;

if (abs(dif) > 10) { printf... }

它使用abs函数来使差异始终为正...更容易进行比较。通过一次读取前两个字节可以略微提高性能。将(无符号)字符分配给整数将使它们易于比较。