关于无符号类型的说明

问题描述 投票:2回答:3

嗨,我目前正在学习C,有些事情我还是不太了解。首先,我被告知如果我这样做:

unsigned int c2 = -1;
printf("c2 = %u\n", c2);

根据此表,它将输出255:enter image description here

但是我得到一个奇怪的结果:c2 = 4294967295

现在奇怪的是,这有效:

unsigned char c2 = -1;
printf("c2 = %d\n", c2);

但是我不明白,因为既然char是一个char,为什么它甚至还能打印任何内容?由于此处的说明符是“%d”,而不是“%u”,因为它应用于无符号类型。

c memory char unsigned
3个回答
1
投票

在C整数中可以具有多个表示形式,因此多个存储大小和值范围有关更多详细信息,请参考下表。

enter image description here


0
投票

在此声明中

unsigned char c2 = -1;

-1的内部表示形式被截断并解释为无符号字符。即,对象c2的所有位被设置。

在此通话中

printf("c2 = %d\n", c2);

具有无符号字符类型的参数被提升为类型int,并保留其值为255。此值作为整数输出。


0
投票

以下代码:

unsigned int c2 = -1;
printf("c2 = %u\n", c2);

出于以下两个原因,永远不会打印255

  1. 您正在查看的表是指8位无符号整数。为了符合C标准,C中的int必须至少为16位。因此,如果您使用%d,则您将要设置的值很可能会是一个更高的负数。
  2. 使用格式说明符%u永远不会输出负值,因为它需要一个无符号的整数并将所传递的变量解释为无符号的。如果要将c2解释为signed整数,则必须改用%d

获得255作为输出的正确代码是:

unsigned char c = -1;
printf("c = %hhd\n", c);

hh前缀说明符的意思(来自man 3 printf):

hh:以下整数转换对应于signed charunsigned char自变量,或以下n转换sion对应于指向signed char参数的指针。

© www.soinside.com 2019 - 2024. All rights reserved.