我正在编写代码,比较代表整数的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");
}
感谢。
答案 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
函数来使差异始终为正...更容易进行比较。通过一次读取前两个字节可以略微提高性能。将(无符号)字符分配给整数将使它们易于比较。