【问题标题】:Maximum value of unsigned char无符号字符的最大值
【发布时间】:2011-03-23 08:37:42
【问题描述】:
#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",i<<1);
    return 0;
}

为什么这个程序打印 256?

据我了解,由于 0x80= 0b10000000,并且 unsigned char 有 8 位,“1”应该在左移后溢出,输出应该是 0,而不是 256。

【问题讨论】:

  • 不想作为答案发布,因为我不是 100% 确定,但不是因为 %d 是整数吗?因此,幕后的代码可能会将i&lt;&lt;1 分配给一个整数来打印它,这意味着它适合并且不会溢出。试试printf("%c", i&lt;&lt;1);?
  • @Stephen:应该已经发布了答案;)
  • @Stephen: 当我使用 %c 时输出是空白的。
  • 哦,好吧,我想我是在正确的轨道上。抱歉 %c 不起作用 - 我没有编译器可以检查它!
  • 在大多数编译器上,i &lt;&lt; n 将产生一个整数,而不管原始类型如何。

标签: c bit-manipulation unsigned-char


【解决方案1】:

这是 C 的整数提升规则的结果。本质上,进入表达式的大多数变量都是“提升”的,这样这样的操作就不会失去精度。然后,根据 C 的变量参数规则,它作为 int 传递到 printf

如果你想要你正在寻找的东西,你必须回溯到unsigned char

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",((unsigned char)(i<<1)));
    return 0;
}

注意:使用斯蒂芬评论中指定的%c 将不起作用,因为%c 也需要一个整数。

编辑:或者,您可以这样做:

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    unsigned char res = i<<1;
    printf("%d",res);
    return 0;
}

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",(i<<1) & 0xFF);
    return 0;
}

【讨论】:

  • 你能把(i&lt;&lt;1)转换成unsigned char吗?
  • @Nathon:这不是我做的吗?
  • 奇怪,我必须打开眼罩。
  • “使用斯蒂芬评论中指定的 %c 将不起作用,因为 %c 也需要一个整数。” --> "%c""%d" 都接受 int"%c" 将其 int 转换为 unsigned char,然后打印该字符。
  • @R..:为了完整性,应该提到unsigned char升级为signed int unsigned int取决于是否或者不是unsigned char 的所有值都可以用signed int 表示,并且"%c" 说明符需要signed int,它是几种整数类型之一。
【解决方案2】:

不要忘记专门用于打印无符号的格式。

printf("%u",(unsigned char)(i<<1));

【讨论】:

  • 由于 C 的提升规则,参数很可能会作为 signed int 传递给 printf,而不是 unsigned。您应该将参数转换为与格式说明符匹配的类型。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多