C 有没有一种简单的方法可以将带符号的字符转换为不带符号扩展名的整数?

C 有没有一种简单的方法可以将带符号的字符转换为不带符号扩展名的整数?,c,C,在C语言中,我想将带符号字符转换为int,不带符号扩展名。因此,如果有符号字符是0xFF,那么int也将是0xFF。简单地将其转换为int将不起作用;结果将是0xFFFFFF(在32位机器上) 这似乎可行(而且已经相当简单): 但是有没有更简单或更惯用的方法呢 编辑:固定函数您可以先强制转换为无符号字符。假设定义: signed char c; 你可以这样做: int i = (unsigned char)c; 您可以先强制转换为无符号字符。假设定义: signed char c; 你可以

在C语言中,我想将
带符号字符
转换为
int
,不带符号扩展名。因此,如果
有符号字符
是0xFF,那么
int
也将是0xFF。简单地将其转换为int将不起作用;结果将是0xFFFFFF(在32位机器上)

这似乎可行(而且已经相当简单):

但是有没有更简单或更惯用的方法呢


编辑:固定函数

您可以先强制转换为
无符号字符
。假设定义:

signed char c;
你可以这样做:

int i = (unsigned char)c;

您可以先强制转换为
无符号字符
。假设定义:

signed char c;
你可以这样做:

int i = (unsigned char)c;
您还可以使用联合(行为是由实现定义的,但编译器在很大程度上支持它)

或者,正如Carl Norum所说,您可以简单地强制转换为
无符号字符

int 
convert(signed char ch)
{
    return (int)(unsigned char)ch;
}
但是要小心,因为存在
0xFF
char
值溢出(十进制255)。

您也可以使用联合(行为由实现定义,但编译器基本上支持)

或者,正如Carl Norum所说,您可以简单地强制转换为
无符号字符

int 
convert(signed char ch)
{
    return (int)(unsigned char)ch;
}

但是要小心,因为
0xFF
char
值(十进制255)会溢出。

您的实现可能允许您通过类型双关来实现这一点,也就是说,使用包含这两种类型的并集,分配给
char
,然后从
int
读取。不过,这是实现定义的行为(即,您需要阅读编译器手册的附录),而且您可能最好使用一个可移植的解决方案,这就是为什么这不是一个答案;该值只是被保留。如果要更改该值,请执行算术运算。特别是,看起来您希望将模256减少到这个范围[0255).要添加到@R.的注释中,如果您的签名字符是8位,那么就C而言,它的值永远不会
0xFF
,这完全等于255-它的最大值是
0x7f
。@R这不只是语义问题吗?至少在二补机器上,符号扩展将保留该值,对吗?但是,我想一个更好的表达我想要做的事情的方法是,我想要取一个有符号字符,并生成一个整数,它的低阶位与有符号字符相同,高阶位都是零。我当然应该使用-1作为有符号字符的样本值!您的实现可能允许您通过类型双关来实现这一点-也就是说,using一个包含这两种类型的联合,分配给
char
,然后从
int
读取。不过这是实现定义的行为(也就是说,您需要阅读编译器手册的附录),使用可移植的解决方案可能要好得多,这就是为什么没有将其作为答案来编写的原因。“签名扩展”不是正在发生的情况;值只是被保留。如果要更改值,请执行算术运算。特别是,看起来您希望将模256减小到范围内[0255).要添加到@R.的注释中,如果您的签名字符是8位,那么就C而言,它的值永远不会
0xFF
,这完全等于255-它的最大值是
0x7f
。@R这不只是语义问题吗?至少在二补机器上,符号扩展将保留该值,对吗?但是,我想一个更好的表达我想要做的事情的方法是,我想要取一个有符号的字符,并生成一个整数,它的低阶位与有符号的字符相同,高阶位都是零。我当然应该使用-1作为有符号字符的样本值!在这种特殊情况下,并集是一个坏主意,原因有二:它不会做s在big-endian体系结构上使用ame(其中,
.c1
很可能与
.c2
的最高有效字节别名);而
.c2
的剩余字节永远不会初始化。在这种特殊情况下,联合是一个坏主意,原因有二:它不会在big-endian体系结构上执行相同的操作(其中,
.c1
很可能与
.c2
的最高有效字节别名);而
.c2
的剩余字节从未初始化。谢谢,我认为这使意图最清晰(一旦看到它就很明显)。谢谢,我认为这使意图最清晰(一旦看到它就很明显)。