Usigned char超过255

时间:2016-03-04 12:30:09

标签: c bit-manipulation

我想使用unsigned char作为字节。我希望它的范围从0255

我定义了以下宏:

#define ROTATE_LEFT(BYTE) ((BYTE & 128) > 0) ? ((BYTE << 1) | 1) : (BYTE << 1)

我想把它旋转到左边。

现在我通过以下方式测试了它:

unsigned char c1 = 1;
unsigned char c2 = 128;
unsigned char c3 = 255;
unsigned char c4 = 200;
printf("%u\n", ROTATE_LEFT(c1)); // Expected: 2, Result: 2
printf("%u\n", ROTATE_LEFT(c2)); // Expected: 1, Result: 257
printf("%u\n", ROTATE_LEFT(c3)); // Expected: 255, Result: 511 
printf("%u\n", ROTATE_LEFT(c4)); // Expected: 145, Result: 401

正如您所看到的,我得到的结果甚至不可能。 怎么了?

2 个答案:

答案 0 :(得分:10)

这是因为整数提升

在传递给printf之前,您的结果会被提升为更大的整数。

在将该变量传递给printf之前,您可以将结果存储回变量中。它们必然会被截断。

此外,printf的{​​{1}}说明符为unsigned char

最后,我会建议以下(未经测试):

%hhu

答案 1 :(得分:0)

就像这样:

unsigned char c4 = 200;
printf("%u\n", c4 + 56);

输出:256

这与unsigned char c4类型无关,只需将大于255的值传递给printf函数。