【问题标题】:how char is changed to int while doing calculations in c?在c中进行计算时如何将char更改为int?
【发布时间】:2014-08-20 23:28:10
【问题描述】:

在下面的程序中,虽然 a 和 b 具有相同的值,但输出是“不一样”?我用谷歌搜索,发现 a 和 b 的值转换为 int。a 的新值为 -5,b 的新值为 251。我不明白它们在类型转换后如何变得如此不同? 二进制中的 a 是 11111011 而 b 是 11111011 所以当它们被类型转换为 int a应该变成-53,怎么是-5。请解释一下?

#include<stdio.h>
int main(){
char a = 0xfb;
unsigned char b = 0xfb;

printf("a = %c", a);
printf("\nb = %c", b);

if (a == b)
  printf("\nSame");
 else
 printf("\nNot Same");   
 return 0;
} 

【问题讨论】:

  • 从哪里得到 11111011 = 117?它是 128+64+32+16+8+2+1 = 251。
  • 我的错误谢谢指出。
  • 不相关:首选\n在行尾:printf("...\n", ...)。你的方式看起来很奇怪(甚至可能是错误的?)printf("\n...", ...) ... 上面程序的最终输出 不是 由换行符终止(我会说它不是 line)

标签: c binary char int


【解决方案1】:

不,问题不在于它们被转换为int 问题很可能是您的线路

char a = 0xfb;

在您的系统上,char 可能是 signed 数据类型,但 0xfb 是不适合目标类型范围的无符号值。因此它以实现定义的方式转换,通常为负数。所以ab 肯定没有相同的值。

【讨论】:

  • 对于 gcc,char 的默认值是有符号的。 (可能。所以 EOF 可以被抓住......)
  • Visual Studio 也一样。
  • @Jim signed char 如何启用“可以抓取 EOF”?
  • 如果(例如)您有一个返回无符号字符(而不是字符)的 getc,则 EOF (-1) 将转换为正数,然后可能不会被检测到。跨度>
  • @Jim getc() 总是,根据 C 规范,返回 int 范围内的 unsigned charEOF,而不考虑 char签名或未签名。将getc() 的结果直接分配给char(有符号或无符号)确实失去了区分EOF 和某些char 的能力。健壮的代码正是为此目的将getc() 的结果分配给int
【解决方案2】:

字符 a 的取值范围是 -128 到 +127。 unsigned char b 的范围是 0 到 255。相同的位值 (11111011) 表示不同的含义,因为一个是有符号的,另一个是无符号的。

【讨论】:

  • 注意:char 的范围可能与unsigned char 相同。最好想到 charunsigned charsigned char 具有相同的范围,而不是 -128 到 127。
  • 大多数字符(gcc 和 Visual Studio)默认为已签名。
【解决方案3】:

ab 具有与 char 相同的二进制表示。但是当对ab进行比较操作时,它们首先被转换为int。 a 是有符号的char,当它转换为int 时,它的值变为-5(有符号的值为0xfb)。 b 是无符号字符,当它转换为 int 时,它的值变为 251。值 -5 和 251 与 int 有不同的表示,因此我们得到输出为“Not Same”。

【讨论】:

    【解决方案4】:

    0x 表示数字为十六进制。

    十六进制的fb11111011。 对于签名号码,它是-5 对于未签名的,它是251。 有符号数以 2 的补码形式表示。 所以如果一个数字是 2 的补码形式,那么它转换成十进制如下:

    1 1 1 1 1 0 1 1
    -(2)^7 2^6 ------------------------------------------------ 2^0
    -127+64+32+16+8+0+4+1
    =-5
    

    对于无符号数,只需找到 11111011 = 251 的十进制等值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 2023-01-13
      • 2021-01-08
      • 2014-05-17
      • 1970-01-01
      • 2017-11-21
      • 2012-06-04
      相关资源
      最近更新 更多