在类型转换为char之后打印单个字节

时间:2017-02-09 11:31:40

标签: c casting char unsigned-char

我从套接字收到一些数据 之后,我想在接收的char数组中打印一个字节。

以下是我使用的代码:

char buf[100];                                                                
int i = 0;                                                                    
while (1)                                                                     
{                                                                             
    rc = recv(socket_fd, buf, sizeof(buf), 0);                                  

    if (rc > 0)                                                                 
    {                                                                           
        printf("Pos1 = %x.\n", (char)buf[17]);   
        printf("Pos2 = %x.\n", (char)buf[22]);   
    }     
}

但这打印出4个字节。如果我将字符强制转换为 unsigned char ,则会打印单个字节。那么这两个类型转换之间的区别是什么,这会导致打印不同的字节数。

输出:

Pos1 = 1

Pos2 = ffffff83

4 个答案:

答案 0 :(得分:1)

如果您只想打印2个半字节,请使用:

@Component({
    templateUrl: "PATH HERE"
})

在某些系统上,printf("Pos1 = %02x.\n", (unsigned)(unsigned char)buf[17]); /* ^^ */ /* Print 2 nibbles with 0 prefix if required */ 可能表现为char,您会看到signed char前置显示负数。因此,您必须在此类系统上投放ffbuf[i]。第二个unsigned用于匹配带有说明符unsigned char

的参数类型

Working example

答案 1 :(得分:1)

如果你在C stdio lib上找到printf

的参考文献

指定符'x'打印无符号十六进制整数。

首先,print函数将期望一个整数值。

在您的示例中,您将转换为已签名的字符。

似乎正在进行的是,当您将变量转换为带符号的char时,如果该值超过127(0X7F),则设置的有符号位将扩展为4字节整数实体。另一方面,如果值为正(0到127),则输出(尽管在技术上是无符号的int值)将与unsigned char cast相同。

例如,如果您强制转换为Char,则128(0x80)将显示为FFFFFF80 施放为无符号字符时为80.

另一方面的

127将显示为7F并且有任何一个演员。

因此,在使用printf时,您要打印的变量类型应与说明符类型匹配。

答案 2 :(得分:1)

  

那么这两个类型转换之间有什么区别,导致不同的字节数?

传递给函数printf的每个输入参数在被推入堆栈之前被“扩展”为4或8个字节(取决于其类型)。

当您传递类型为signed的输入参数时,符号位将被“保留”。

例如,signed char 0x89已扩展为signed int 0xFFFFFF89

unsigned char 0x89扩展为unsigned int 0x00000089

请注意,上面的答案取决于平台。

我认为在你的平台上:

  • CHAR_BIT是8
  • sizeof int是4
  • sizeof double是8

关于printf输入参数的AFAIK:

  • 小于int的整数参数扩展为int
  • 小于double的非整数参数扩展为double

答案 3 :(得分:0)

告诉printf您通过

传递了unsigned int的一半的一半
printf("Pos1 = %hhx.\n", (unsigned char) buf[17]);