我在将char
投射到unsigned int
时遇到了意外行为。有时剩余的位用0填充,其他时间用1填充。
在gcc 4.9.2上测试的简单程序
unsigned int test_1 = 0x01;
unsigned int test_2 = (char)(0x01);
unsigned int test_3 = 0xc3;
unsigned int test_4 = (char)(0xc3);
输出
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000001
00000000 00000000 00000000 11000011
11111111 11111111 11111111 11000011
我希望"空白"位填充0而不是1。
预期产出:
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000001
00000000 00000000 00000000 11000011
00000000 00000000 00000000 11000011
以下完整代码:
#include "stdio.h"
#define binary_p( x ) printBits(sizeof(x),&x)
void printBits(size_t const size, void const * const ptr)
{
unsigned char *b = (unsigned char*) ptr;
unsigned char byte;
int i, j;
for (i=size-1;i>=0;i--)
{
for (j=7;j>=0;j--)
{
byte = (b[i] >> j) & 1;
printf("%u", byte);
}
printf(" ");
}
puts("");
}
int main(int argc, char *argv[])
{
unsigned int test_1 = 0x01;
unsigned int test_2 = (char) (0x01);
unsigned int test_3 = 0xc3;
unsigned int test_4 = (char) (0xc3);
binary_p(test_1);
binary_p(test_2);
binary_p(test_3);
binary_p(test_4);
return 0;
}
答案 0 :(得分:2)
在这种情况下:
unsigned int test_3 = 0xc3;
常量0xc3
的类型为int
。它的值(195)位于int
的正范围内,因此当它通过赋值转换为unsigned int
时,它会保留该值。
至于这种情况:
unsigned int test_4 = (char)(0xc3);
首先将值转换为char
。假设char
是8位且2的补码表示用于负数,则该表示落入负范围(-61)。因此,当它被转换为更大的类型时,添加的额外位被设置为1以保持相同的负值。
答案 1 :(得分:0)
尝试
(unsigned char)(0xc3)
(unsigned char)(0xc3)
而不是
(char)(0x01)
(char)(0xc3)
应该做的伎俩