unsigned char 超过 255
Usigned char goes over 255
我想使用一个 unsigned char
作为一个字节。我希望它的范围从 0
到 255
。
我定义了以下宏:
#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
如您所见,我得到了不可能的结果。
怎么了?
这是因为 整数提升。
在传递给 printf 之前,您的结果会被提升为更大的整数。
在将该变量传递给 printf 之前,您可以将结果存储回您的变量中。它们必然会被截断。
此外,unsigned char
的 printf
说明符是 %hhu
。
最后,我会建议以下(未经测试):
static inline uint8_t rol8(uint8_t x)
{
uint8_t low = (x & (1<<7)) >> 7;
return (x << 1) | low;
}
就像这样:
unsigned char c4 = 200;
printf("%u\n", c4 + 56);
输出:256
这与c4
的unsigned char
类型无关,您只是将大于255的值传递给printf
函数。
我想使用一个 unsigned char
作为一个字节。我希望它的范围从 0
到 255
。
我定义了以下宏:
#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
如您所见,我得到了不可能的结果。 怎么了?
这是因为 整数提升。
在传递给 printf 之前,您的结果会被提升为更大的整数。
在将该变量传递给 printf 之前,您可以将结果存储回您的变量中。它们必然会被截断。
此外,unsigned char
的 printf
说明符是 %hhu
。
最后,我会建议以下(未经测试):
static inline uint8_t rol8(uint8_t x)
{
uint8_t low = (x & (1<<7)) >> 7;
return (x << 1) | low;
}
就像这样:
unsigned char c4 = 200;
printf("%u\n", c4 + 56);
输出:256
这与c4
的unsigned char
类型无关,您只是将大于255的值传递给printf
函数。