我做了一个函数来将一个数字转换成它的二进制形式:
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/