我使用了'unsigned char'类型,以便将数据范围扩大到255,但没有这样做

我使用了'unsigned char'类型,以便将数据范围扩大到255,但没有这样做,c,date-range,C,Date Range,我有一个简单的代码将十进制转换为二进制,如下所示 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 number= 150, reminder=0;
while(number > 0){
   printf("number=%d, ", number);
   reminder = number % 2;
   number /= 2;
   printf("reminder=%d\n", reminder);
}
printf("\n");
问题是当我输入一个大于127的十进制数时,给我一个表示负数的二进制数

怎么会给我一个负数,而我只使用了
无符号字符
而不是
字符

()


注意:我使用的是VisualStudio2010

对于
printf
使用
%u
而不是
%d


%d
用于签名,而
%u
用于未签名的数字打印。

我认为您需要以下内容:

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

这对你有用吗?有关原因的解释,请参见关于这个问题的讨论。

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

下面将解释获得a-ve号码背后的故事

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

例如:对于有符号字符,如果值超过127,则返回-ve数字,即有符号字符的起始范围。对于128,它是a-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();
}
#包括
#包括
int main()
{
char ch1=128;
无符号字符ch2=257;
printf(“%d\n%d”,ch1,ch2);
getch();
}
o/p:-128
一,

示例程序2:

#include<stdio.h>

Void main()

{
unsigned char ch;
for(ch=0;ch<=255;ch++)
{
printf("%d-%c",ch,ch);
}
}
#包括
Void main()
{
无符号字符ch;

对于(ch=0;ch?@Lion King我正在使用visual studio 2012,但我无法复制它。对不起,我不明白你的意思,你是什么意思?我这样做,但在8位给我一个负数,但在16位给我一个正确的数字。为什么在8位不需要给我正确的数字?你有一个例子吗?谢谢你提供的有用信息,但我知道在我们的示例中,我使用的是
无符号字符
,假设值最大为255,在我的示例中
无符号字符数=150
.150它没有达到255的限制,因此,问题出在哪里?很可能是您的编译器出了问题或某些东西被损坏了…在线检查您的代码…www.ideone.com…因为我编译了你的代码。我得到了正确的输出…+1,但是显式转换为unsigned int是不必要的,没有?
printf
已经解决了这个问题。