首页 > 试题广场 >

32位机器上,以下代码的输出是 char c = -1;

[单选题]
32位机器上,以下代码的输出是()
char c = -1;
int i0 = c;
int i1 = (unsigned char)c;
printf("%d, %d\n", i0, i1);
  • 255,255
  • -1,-1
  • -1,255
  • 255,-1
[unsigned]char 到 [unsigned]int需要类型提升

类型提升时,有符号型高位补符号位无符号型高位补0(是对这个数的补码补码补码进行补位!)

char c = -1,所以它的原码是1000 0001,补码是1111 1111

先看i0,是 char->int 的转换,有符号型提升,于是高位补符号位,所以i0的补码就是1111 1111 1111 1111
所以换回原码i0 = -1

再看i1,是先(1)char->unsigned,再(2)unsigned char->int 的转换:
(1)这一步不涉及补位,也就是说数字的补码不变,还是1111 1111,但是这时候已经没有符号位了,变成了无符号型
(2)无符号型提升高位补0,所以i1的补码就是0000 0000 1111 1111
所以换回原码i1 = 255
编辑于 2021-06-25 15:19:54 回复(0)
char类型有符号,所以-1可以表示,uchar类型无符号(范围是0-255),-1是1000 0001,转换成补码是1111 1111,uchar无符号位,所以最高位的1也计算到值里,为1+2+4+...+128=255
发表于 2018-09-08 18:55:24 回复(0)
有问到为什么 i0 不能是 255 的同学,请你们想一下,在 C++ 中数值类型进行运算时,在不同的类型混合运算中的类型提升。
char 提升为int,保持值不变(向上提升,这是编译器所保证的)。

发表于 2021-02-22 18:18:59 回复(0)
<p>我觉得这道题有问题。 char 为-1,其编码就为1111 1111,int为4字节,其低8位为1111 1111,char转换成int,高位补0,地位就是1111 1111,转化后的int编码为0000 0000 00000000 00000000 11111111,显然,int数据为255</p>
发表于 2020-11-20 14:34:20 回复(2)
这段代码涉及到 C 语言中的类型转换和整数提升规则。让我们逐步分析这段代码:

1. `char c = -1;`:这里声明了一个 `char` 类型的变量 `c` 并将其初始化为 `-1`。在 C 语言中,`char` 类型可能是有符号的(signed)或无符号的(unsigned),这取决于编译器和平台。如果 `char` 是有符号的,那么 `-1` 就会被存储为其二进制补码形式。

2. `int i0 = c;`:这里将 `char` 类型的 `c` 赋值给 `int` 类型的 `i0`。如果 `char` 是有符号的,并且在您的系统上 `char` 是 8 位的,那么 `-1` 的二进制表示可能是 `11111111`(补码形式)。在赋值给 `int` 类型时,会发生符号扩展(sign extension),以保持数值的符号不变。假设 `int` 是 32 位,那么 `i0` 将会是 `11111111 11111111 11111111 11111111`,即 `-1` 的 32 位补码表示。

3. `int i1 = (unsigned char)c;`:这里首先将 `c` 强制转换为 `unsigned char`,然后再赋值给 `int` 类型的 `i1`。将 `-1` 转换为 `unsigned char` 会得到 `255`(因为 `11111111` 在无符号 8 位整数中表示 `255`)。然后,这个 `255` 被赋值给 `int` 类型的 `i1`,在这个过程中不会发生符号扩展,因为值已经是无符号的。因此,`i1` 将会是 `00000000 00000000 00000000 11111111`,即 `255` 的 32 位表示。

4. `printf("%d, %d\n", i0, i1);`:这行代码将打印 `i0` 和 `i1` 的值。根据上述分析,输出将是 `-1, 255`。
发表于 2023-11-15 22:18:45 回复(0)

为啥i0不能等于255


发表于 2019-08-31 20:16:19 回复(2)