将char转换为int时的意外行为

时间:2017-03-15 16:00:50

标签: c type-conversion

我在将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;
}

2 个答案:

答案 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)

应该做的伎俩