字节在C符号int(Byte to signed int in C)

2019-09-20 20:31发布

我有存储在在C字符的二进制值,我想这个字节转换成C.符号整数目前,我有这样的事情:

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

在标准输出的结果将是“255”,期望的输出为“-1”。

Answer 1:

更换:

char a = 0xff

通过

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

printf打印-1

如果你不想改变的类型a ,如@veer中,你可以简单地把注释添加a(signed char)指定其值设置为前b

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



Answer 2:

根据C99标准,

6.3.1.3符号和无符号整数

当与整数类型的值被转换为比其它_Bool另一个整数类型,如果该值可以通过新的类型来表示,它是不变的。

否则,如果新类型是无符号的,则该值是通过重复地加上或减去小于能够在新的类型来表示,直到该值是在新的类型的范围的最大值一个更转换。

否则,新的类型是有符号和值不能在它来表示; 任一结果是执行德音响定义或一个实现德音响奈德信号上升。


您需要将投下charsigned char分配给前int ,因为任何值char可能采取的是作为一个直接表示的int

#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

警惕的是char由C99标准不确定它是否被视为带符号。

6.2.5类型

声明为类型char一个目的是大到足以存储所述基本执行字符集的任何成员。 如果基本执行字符集的一个成员被存储在一个字符对象,它的值被保证是正的。 如果任何其他的字符被存储在char对象,所得到的值是实现德音响定义但应是可以在该类型来表示的值的范围内。

...

这三种类型的字符符号的字符 ,和unsigned char统称为字符类型。 实现应定义字符具有相同的范围,表示和行为要么签署charunsigned char。



Answer 3:

你是从一开始就已经错了:

char a = 0xff;

如果charsigned ,您似乎认为,在这里,你已经有一个值超出范围, 0xFF是价值无符号数255 。 如果你想看到char有符号数使用signed char并指定-1到它。 如果你想看到它作为一个位模式使用unsigned char ,并指定0xFF它。 你的初始化int接下来将做你期望它做的事情。

charsigned charunsigned char是由标准的三种不同类型的定义。 储char本身的字符,打印人类可读的东西。



文章来源: Byte to signed int in C