我有一个二进制值存储在 C 中的 char 中,我想将此字节转换为 C 中的有符号 int。目前我有这样的东西:
char a = 0xff;
int b = a;
printf("value of b: %d\n", b);
标准输出中的结果将为“255”,所需的输出为“-1”。
我有一个二进制值存储在 C 中的 char 中,我想将此字节转换为 C 中的有符号 int。目前我有这样的东西:
char a = 0xff;
int b = a;
printf("value of b: %d\n", b);
标准输出中的结果将为“255”,所需的输出为“-1”。
根据 C99 标准,
6.3.1.3 有符号和无符号整数
当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则保持不变。
否则,如果新类型是无符号的,则通过在新类型中可以表示的最大值的基础上反复加减一,直到该值在新类型的范围内。
否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。
您需要在分配 to 之前将您char
转换为 a ,因为任何可以采用的值都可以直接表示为 a 。signed 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对象中,则其值保证为正数。如果任何其他字符存储在char对象中,则结果值是实现定义的,但应在该类型可以表示的值范围内。
...
char、signed char和unsigned char这三种类型统称为字符类型。实现应将 char 定义为与signed char或unsigned char具有相同的范围、表示和行为。
代替:
char a = 0xff
经过
signed char a = 0xff; // or more explicit: = -1
要有printf
指纹-1
。
如果您不想更改 的类型a
,正如@veer 在评论中添加的那样,您可以a
在(signed char)
将其值分配给b
.
请注意,在这两种情况下,此整数转换都是实现定义的,但这是常见的实现定义的行为。
你从一开始就错了:
char a = 0xff;
if char
is signed
,您似乎假设,在这里您已经有一个超出范围的值,0xFF
是一个带有 value 的无符号量255
。如果您想查看char
签名号码,请使用signed char
并分配-1
给它。如果您想将其视为位模式,请使用unsigned char
并分配0xFF
给它。然后你的初始化int
会做你期望它做的事情。
char
,signed char
并且unsigned char
根据标准的定义是三种不同的类型。保留char
自己的字符,打印人类可读的东西。