我在C语言中有一个存储在char类型变量中的二进制值,我想将这个字节转换为带符号整数。
目前我有如下代码:
char a = 0xff;
int b = a;
printf("value of b: %d\n", b);
标准输出结果为“255”,期望的输出结果是“-1”。
我在C语言中有一个存储在char类型变量中的二进制值,我想将这个字节转换为带符号整数。
目前我有如下代码:
char a = 0xff;
int b = a;
printf("value of b: %d\n", b);
#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
是被视为有符号还是无符号的。SCHAR_MAY == 512
,以便这段代码会打印出“b的值:255”? - tiwo替换:
char a = 0xff
by
signed char a = 0xff; // or more explicit: = -1
让printf
打印-1
,你可以这样做。
如果您不想改变a
的类型,可以按照@veer在评论中添加的方法,将a
简单地转换为(signed char)
,然后再将其值分配给b
。
请注意,在这两种情况下,这种整数转换是实现定义的,但这是常见的实现定义行为。
signed char
通常可以容纳从 -128
到 127
的值。在这里,您正在将无符号值 255
分配给它。这是一种溢出。 Ouah 正确指出,然后发生的事情是实现定义的。其中可能发生的这些实现定义的事情之一是“引发信号”。 - Jens Gustedt255
的值被转换为(signed char)
,这个转换受到C99中6.3.1.3p3的规定。由于转换是在赋值之前进行的,因此不会发生溢出。 - ouah你从一开始就错了:
char a = 0xff;
char
是signed
,你似乎是这样假设的,在这里你已经有一个超出范围的值了,0xFF
是一个无符号数量,值为255
。如果你想把char
看作有符号数,请使用signed char
并将其赋值为-1
。如果你想把它看作位模式,请使用unsigned char
并将其赋值为0xFF
。然后你对int
的初始化将会按照你的期望执行。
char
、signed char
和unsigned char
在标准的定义中是三种不同的类型。将char
本身保留给字符,打印可读的人类内容。char
要么是 unsigned char
要么是 signed char
。DR#068 澄清了这一点 http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_068.html - ouahchar
具有与其中一种[un]signed char
类型相同的值范围,但它是一个独立的类型(如C的类型系统所示),不同于任何一个。我想要表达的观点是,这三种类型在标准中给出的语义差异很大,你应该根据它们的意图使用它们。如果可以避免,不要将char
用于算术运算,否则可能会在另一半可能的平台上出错。 - Jens Gustedt
signed char
:int b = (signed char) a;
- obatakuff
的十六进制是 255,所以如果你想要 -1,你期望进行什么样的转换或变换? - CB Bailey