-1

我有一个简单的代码从十进制转换为二进制如下

unsigned char number= 150, reminder=0;
while(number > 0){
   printf("number=%d, ", number);
   reminder = number % 2;
   number /= 2;
   printf("reminder=%d\n", reminder);
}
printf("\n");

问题是当我输入一个大于 127 的十进制数时,给我一个二进制数代表一个负数。

怎么给了我一个负数而且我用unsigned char不只char

在线示例

注意:我使用的是 Visual Studio 2010。

4

3 回答 3

2

用于代替printf_%u%d

%d用于有符号和%u无符号数字打印。

于 2013-11-15T09:01:47.590 回答
1

我认为您需要以下内容:

   printf("reminder=%u\n", (unsigned int)reminder);

那对你有用吗?有关原因的解释,请参阅此处有关此问题的讨论。

于 2013-11-15T10:01:04.567 回答
0

基本上一个 char 是 8 位长(1 个字节),它可以为有符号字符保存 -128 到 127 值,对于无符号字符可以保存 0 到 255 值......并且在任何编译器中,无论是 16 位还是 32 位,它只占用 1字节.......

现在,下面解释了获得 -ve 数字背后的故事......

由于上面显示了有符号和无符号字符的范围,因此每当编译器遇到超出最大值的值时,编译器就会从头开始重新启动。

例如:对于有符号字符,如果值超过 127,它会返回一个 -ve 数字,即有符号字符的起始范围。对于 128,它返回 -128。对于 129 - (-127) 等。

同样适用于无符号字符...

样品 pgm:

#include<stdio.h>
#include<conio.h>

int main()
{
    char ch1 = 128;
    unsigned char ch2 = 257;
    printf("%d\n %d",ch1,ch2);
    getch();
}

o/p:-128
1

示例程序 2:

#include<stdio.h>

Void main()

{
unsigned char ch;
for(ch=0;ch<=255;ch++)
{
printf("%d-%c",ch,ch);
}
}

该程序应打印 ASCII 值和相应的字符。但它不会。这个程序是一个无限循环。原因是 ch 已被定义为 char。并且 char 不能取大于 +127 的值。因此,当 cha 的值为 +127 并且我们执行 ch++ 时,它变为 -128 而不是 +128。-128 小于 255,因此条件得到满足。从这里开始 ch 将采用 -127,-126,-----,-1,0,+1,+2,------,+127,-128,-127 等值。希望这会有所帮助..

于 2013-11-15T10:18:48.167 回答