【发布时间】:2019-05-01 18:26:37
【问题描述】:
我正在使用一个简单的代码将 uint32_t 变量转换为 char。
uint32_t len = 4 + data.length(); //data is a string
char pop1 = len & 0xff;
char pop2 = (len >> 8) & 0xff;
char pop3 = (len >> 16) & 0xff;
char pop4 = (len >> 24) & 0xff; //also tried the same thing with memcpy
printf("%02x \n",pop1);
printf("%02x \n",pop2);
printf("%02x \n",pop3);
printf("%02x \n",pop4);
输出:
ffffff81
02
00
00
我不明白为什么垃圾会被添加到第一个字节。当我改用unsigned char 时,不会添加任何垃圾。据我了解,char 和 unsigned char 都是 8 位,那么为什么 char 被视为 32 位值。我在 64 位 Windows 机器上使用 VS2015。我想将 char 数组用于 WinSock2 的发送函数。
send(ConnectSocket, sendbuf, size_to_send, 0); // sendbuf is a char array
【问题讨论】:
-
TL/DR:在进行位操作时使用
unsigned变量。你的char是signed。 -
@Slava:我希望有一个原件,这是一个副本,但问题不是它。问为什么会出现这些额外的位与问如何避免它们是不同的,后一个问题的答案并不能回答这个问题。
标签: c++ c sockets type-conversion