4

我有一个二进制值存储在 C 中的 char 中,我想将此字节转换为 C 中的有符号 int。目前我有这样的东西:

char a = 0xff;
int b = a; 
printf("value of b: %d\n", b);

标准输出中的结果将为“255”,所需的输出为“-1”。

4

3 回答 3

5

根据 C99 标准,

6.3.1.3 有符号和无符号整数

当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则保持不变。

否则,如果新类型是无符号的,则通过在新类型中可以表示的最大值的基础上反复加减一,直到该值在新类型的范围内。

否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。


您需要在分配 to 之前将您char转换为 a ,因为任何可以采用的值都可以直接表示为 a 。signed charintcharint

#include <stdio.h>

int main(void) {
  char a = 0xff;
  int b = (signed char) a;
  printf("value of b: %d\n", b);
  return 0;
}

快速测试表明它可以在这里工作:

C:\dev\scrap>gcc -std=c99 -oprint-b print-b.c

C:\dev\scrap>print-b
value of b: -1

请注意charC99 标准未定义的是否处理有符号或无符号。

6.2.5 类型

声明为char类型的对象大到足以存储基本执行字符集的任何成员。如果基本执行字符集的成员存储在 char对象中,则其值保证为正数。如果任何其他字符存储在char对象中,则结果值是实现定义的,但应在该类型可以表示的值范围内。

...

charsigned charunsigned char这三种类型统称为字符类型。实现应将 char 定义为与signed charunsigned char具有相同的范围、表示和行为。

于 2012-08-05T20:09:37.393 回答
4

代替:

char a = 0xff

经过

signed char a = 0xff;  // or more explicit: = -1

要有printf指纹-1

如果您不想更改 的类型a,正如@veer 在评论中添加的那样,您可以a(signed char)将其值分配给b.

请注意,在这两种情况下,此整数转换都是实现定义的,但这是常见的实现定义的行为。

于 2012-08-05T20:07:03.560 回答
1

你从一开始就错了:

char a = 0xff;

if charis signed,您似乎假设,在这里您已经有一个超出范围的值,0xFF是一个带有 value 的无符号量255。如果您想查看char签名号码,请使用signed char并分配-1给它。如果您想将其视为位模式,请使用unsigned char并分配0xFF给它。然后你的初始化int会做你期望它做的事情。

charsigned char并且unsigned char根据标准的定义是三种不同的类型。保留char自己的字符,打印人类可读的东西。

于 2012-08-05T20:18:50.743 回答