我已经创建了一个将数字转换为二进制形式的函数:
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
,但结果是相同。有人知道为什么?
答案 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。