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

标签 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 类型,但是结果是一样的。有人知道为什么吗?

最佳答案

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(含)之间的值。这就是您想要的。


注意:

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

The value is reduced to modulo of (max value unsigned char can hold+1) which is 256.

So apply modulo operation and put the result. That will be stored in unsigned char.

关于字符到二进制函数不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336418/

相关文章:

c - 为什么这段代码不退出?

c - 进程间信号量有时无法按预期工作

c - 逐行读取文件内容到矩阵中

java - 将所有大小为 n 的二进制字符串生成到 boolean 数组中的最快方法?

excel - 在 Excel 中使用 10 位以外的有符号数字

Python 对大型二进制字符串的按位运算

c - 使用 chroot 运行二进制文件面临问题

c++ - 从 Pulse Audio 运行简单的 C 程序时出错

java - 尝试用java程序减去二进制数小错误

c# - XOR 运算符 - 它是如何工作的?