C 中字节到有符号 int

xwg*_*gou 4 c casting binary-data

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

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

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

old*_*inb 5

根据C99标准,

\n\n
\n

6.3.1.3 有符号和无符号整数

\n\n

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

\n\n

否则,如果新类型是无符号的,则通过重复加或减新类型可以表示的最大值 1 来转换该值,直到该值在新类型的范围内。

\n\n

否则,新类型是有符号的,并且该值无法在其中表示;结果要么是实现定义的,要么引发实现定义的信号。

\n
\n\n
\n\n

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

\n\n
#include <stdio.h>\n\nint main(void) {\n  char a = 0xff;\n  int b = (signed char) a;\n  printf("value of b: %d\\n", b);\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

快速测试表明它在这里有效:

\n\n
C:\\dev\\scrap>gcc -std=c99 -oprint-b print-b.c\n\nC:\\dev\\scrap>print-b\nvalue of b: -1\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

请注意,charC99 标准未定义是否将其视为有符号或无符号。

\n\n
\n

6.2.5 类型

\n\n

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

\n\n

...

\n\n

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

\n
\n