二进制函数的字符不能按预期工作

时间:2017-11-16 18:06:19

标签: c binary

我已经创建了一个将数字转换为二进制形式的函数:

size_t atobin (char n)
{
    size_t bin= 0, pow;
    for (size_t c= 1; n>0; c++)
    {
        pow= 1;
        for (size_t i= 1; i<c; i++) //This loop is for getting the power of 10
            pow*= 10;
        bin+= (n%2)*pow;
        n/= 2;
    }
    return bin;
}

它适用于数字1到127,但是对于更大的数字(128到255),结果是0 ...我已尝试对每个变量使用类型long long unsigned int,但结果是相同。有人知道为什么?

1 个答案:

答案 0 :(得分:2)

默认情况下,

char在C中被视为已签名。

char是8位(大部分)。对于签名字符,MSB用于签名。因此,您只能使用7位。

0111 1111 2 =(127 10 您的功能可以使用的最大值用。 (因为您传递的是一种可以最多保持127的变量)。

如果使用unsigned char,则MSB不用作符号位。使用所有8位为我们提供最大可能值(1111 1111 2 =(255 10

对于带符号的最小/最大值,-127+127

对于无符号数字最小值/最大值,0+255

因此,即使您将传递的参数unsigned char的类型设置为它可以容纳的最大值+255

更详细一点:

Q)>127参数分配char值时会发生什么情况?

默认情况下是signed char。它是8位。但它不能成功。那会发生什么?

结果是实现定义。但是

假设值为130。在二进制文件中,它是10000010。在大多数情况下,这会返回-126。这将是n的价值。 n>0;失败了。永远不会输入循环。它返回0

现在如果我们将它设为unsigned char,那么它可以保存0到255之间的值(包括0和255)。这就是你想要的。

注意:

Q)>255值存储在unsigned char中时会发生什么?

  

该值减少到(max value unsigned char can hold+1)的模数   256。

     

所以应用模运算并输出结果。那将存储在   unsigned char。