为什么"大于"不使用char类型?

时间:2016-03-03 11:30:35

标签: c++

我正在OTB(C ++库)中实现图像处理过滤器。

我通过一些非常基本的测试得到了一个奇怪的行为。当我将图像读作" char"时,以下代码总是输出像素值(在0-200范围内),即使它大于150.但是,当我使用&#34时,它工作正常; short int"。 " char"是否有特殊行为? (比如字母比较而不是数字值)或者还有其他原因吗?

当然,我的图像像素存储在字节中,所以我更喜欢处理" char"而不是" int"因为图像非常大(> 10 Gb)。

if (pixelvalue > 150)
{
out = 255;
}
else
{
out = pixelvalue;
}

2 个答案:

答案 0 :(得分:11)

<script> function scrollTo(image_id){ var topLeft = document.getElementById(image_id).offsetTop; document.getElementById('container').scrollLeft = topLeft; } </script> <div id="container" class="images_container"> <img id="image_1" src="/image1.jpg" height="500px" width="500px"> <img id="image_2" src="/image2.jpg" height="500px" width="500px"> <img id="image_3" src="/image3.jpg" height="500px" width="500px"> </div> <div class="images_container thumbnails"> <a href="#image_1"><img src="/image1.jpg" class="thumbnail" onclick="scrollIntoView('image_1')"></a> <a href="#image_2"><img src="/image2.jpg" class="thumbnail" onclick="scrollIntoView('image_2')"></a> <a href="#image_3"><img src="/image3.jpg" class="thumbnail" onclick="scrollIntoView('image_3')"></a> </div> 运行至(至少)255,但unsigned char可能会被签名并限制为127.

答案 1 :(得分:5)

类型char是有符号或无符号的(取决于编译器“喜欢”的内容 - 有时可以选择有符号或无符号字符类型),保证大小最小为8位(可能是9,16,18,32或36位,即使这种机器相对稀少)。

您的值150高于8位值的最大签名值,这意味着您使用的系统具有签名char

如果类型的目的是特定大小的整数值,请使用[u]intN_t - 在这种情况下,因为您需要无符号值uint8_t。这表明您正在处理的数据不是“字符串”更好[即使在幕后,编译器也会转换为unsigned char。如果遇到char不是8位的机器,这将无法编译,这是防止尝试调试奇怪问题的保护。