爱学习的阿瑶 发表于 2021-11-28 23:05:35

C,D,E三项不是很明白,麻烦有大哥解释一下原理

以下是带你学C带你飞的第七集取值范围的最后一道选择题(原本应该是填空题来着)。

jackz007 发表于 2021-11-28 23:27:55

本帖最后由 jackz007 于 2021-11-28 23:48 编辑

      左边的数据类型是 char ,右边是 unsigned char,同一个字节,在 0 ~ 127 的范围内,char 和 unsigned char 数值重合相等,出了这个范围,char 会进入 -128 ~ -1,而 unsigned char 则会相应进入 128 ~ 255。所以,同一个字节,按 char 和 按 unsigned char 解释,可能会得到完全不同的数值,在数值运算中的表现也会完全不同。本例的 A、B就属于 char 与 unsigned char 数值相等重合,而 C、D、E 则属于二者分道扬镳时的情形。
      参考下面的代码也许可以加深理解:
#include <stdio.h>

int main(void)
{
      char a = 13 , b = 122 , c = -1 , d = -14 , e = -128 ;
      printf("A. %d -> %u\n" , a , a & 0xff)            ;
      printf("B. %d -> %u\n" , b , b & 0xff)            ;
      printf("C. %d -> %u\n" , c , c & 0xff)            ;
      printf("D. %d -> %u\n" , d , d & 0xff)            ;
      printf("E. %d -> %u\n" , e , e & 0xff)            ;
}
      编译、运行实况:
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
A. 13 -> 13
B. 122 -> 122
C. -1 -> 255
D. -14 -> 242
E. -128 -> 128

D:\00.Excise\C>

爱学习的阿瑶 发表于 2021-11-28 23:54:21

主要是D不明白,为什么-14等于10001110,我用进制换算器也算不对

jackz007 发表于 2021-11-29 00:34:44

本帖最后由 jackz007 于 2021-11-29 00:40 编辑

       你完全搞错了,-14 的十六进制数是 0x100 - 0x0e = 0xf2 二进制表述是 1111 0010
       你图片上的 1000 1110 对应的十六进制数是 0x8e,char 的值是 -114 而 unsigned char 的值是 142。和 D 完全没有任何关系。
       在进制换算器中,对于 D,你应该研究的是 242 。对于其它负值,你的研究对象也都应该是它们所对应的 unsigned char 的数值。

爱学习的阿瑶 发表于 2021-11-29 00:47:55

哦,非常谢谢

jackz007 发表于 2021-11-29 01:27:00

爱学习的阿瑶 发表于 2021-11-29 00:47
哦,非常谢谢

      如果问题已经解决,你应该设置 "最佳答案"。
页: [1]
查看完整版本: C,D,E三项不是很明白,麻烦有大哥解释一下原理