Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 8字节有符号值到4字节值(长)_C - Fatal编程技术网

C 8字节有符号值到4字节值(长)

C 8字节有符号值到4字节值(长),c,C,我正在接收具有8字节到字节缓冲区的有符号值[8]。 该符号位是所有值的第63位 这个值不需要这么大的范围,最重要的4个字节是零。 但我需要这个标志 如何将此值重新键入standart signed long(4字节) 符号在第63位,所以 signed char my_sign = buffer[7] & 0x80 ? -1 : 0 给我符号(缓冲区[0]&0x80?-1:0表示另一个印度人:-) 价值大于 signed long my_value = my_sign ? -*(lon

我正在接收具有8字节到字节缓冲区的有符号值[8]。 该符号位是所有值的第63位

这个值不需要这么大的范围,最重要的4个字节是零。 但我需要这个标志

如何将此值重新键入standart signed long(4字节)

符号在第63位,所以

signed char my_sign = buffer[7] & 0x80 ? -1 : 0
给我符号(缓冲区[0]&0x80?-1:0表示另一个印度人:-)

价值大于

signed long my_value = my_sign ? -*(long *)buffer : *(long *)buffer

有更简单的方法吗?

假设大端数,并且您只需要符号,即您的输出为-1或0:

long my_value = buffer[1] & 0x80 ? -1 : 0
我感到迫切需要ASCII图形来增强上述内容的可理解性。下面是我如何假设位在
缓冲区内进行编号的:

6666555555555544444444443333333333222222222211111111110000000000 (tens) 3210987654321098765432109876543210987654321098765432109876543210 (ones) [000000][111111][222222][333333][444444][555555][666666][777777] (bytes) 6666555555554444443333333222222211111111111000000000(十位数) 3210987654321098765432109876543210987654321098765432109876543210(一) [000000][111111][22222][333][444444][555555][666666][777777](字节)
因此,如果您垂直阅读顶部的两行(十和一),在构成“47”(粗体)的列中,您点击了索引为2的字节的左括号。由于括号标记了最高和最低有效位,这意味着您已经到达了索引2处字节的MSB。该位在字节内有索引7,这意味着它的掩码为1假定为大端,并且您只需要符号,即您的输出为-1或0:

long my_value = buffer[1] & 0x80 ? -1 : 0
我感到迫切需要ASCII图形来增强上述内容的可理解性。下面是我如何假设位在
缓冲区内进行编号的:

6666555555555544444444443333333333222222222211111111110000000000 (tens) 3210987654321098765432109876543210987654321098765432109876543210 (ones) [000000][111111][222222][333333][444444][555555][666666][777777] (bytes) 6666555555554444443333333222222211111111111000000000(十位数) 3210987654321098765432109876543210987654321098765432109876543210(一) [000000][111111][22222][333][444444][555555][666666][777777](字节)
因此,如果您垂直阅读顶部的两行(十和一),在构成“47”(粗体)的列中,您点击了索引为2的字节的左括号。由于括号标记了最高和最低有效位,这意味着您已经到达了索引2处字节的MSB。该位在字节内有索引7,这意味着它的掩码是18字节值中的负数用什么表示?如果它使用了2的补码,那么您可以依赖这样一个事实,即2的补码值可以安全地截断为任何长度,而无需执行任何额外的步骤。只要不截断任何“占用”位置,原始值就会保留

即,正8字节值将在较高的“未使用”字节中包含所有零,而负值将在较高的“未使用”字节中包含所有零。根据字节顺序,您可能不需要做任何事情:只需取下较低的4个字节,您就完成了


那么,负数用什么表示呢?您说过高阶字节包含零。我们是否应该假设即使是负数,它们也包含零?如果是这样,则使用的表示法不是2的补码。

8字节值中的负数使用什么表示法?如果它使用了2的补码,那么您可以依赖这样一个事实,即2的补码值可以安全地截断为任何长度,而无需执行任何额外的步骤。只要不截断任何“占用”位置,原始值就会保留

即,正8字节值将在较高的“未使用”字节中包含所有零,而负值将在较高的“未使用”字节中包含所有零。根据字节顺序,您可能不需要做任何事情:只需取下较低的4个字节,您就完成了


那么,负数用什么表示呢?您说过高阶字节包含零。我们是否应该假设即使是负数,它们也包含零?如果是,则使用的表示法不是2的补码。

负数存储在2的补码中,这意味着64位-1=0xFFFFFFFFFF。如果只选择32个最低有效位,则得到0xFFFFFF=-1。因此,假设您正在处理32位范围内的数字,应该能够以完全相同的方式处理正数和负数

负数存储在2的补码中,这意味着64位-1=0xFFFFFFFFFFFF。如果只选择32个最低有效位,则得到0xFFFFFF=-1。因此,假设您正在处理32位范围内的数字,应该能够以完全相同的方式处理正数和负数

符号在第47位,所以缓冲区[8]&0x80-1:0给我符号是不是在
buffer[2]&0x80
(对于大端数)或
buffer[5]&0x80
(对于小端数)的47位?符号在47位,所以buffer[8]&0x80-1:0给我一个符号是的。在
buffer[2]&0x80
(用于大端)或
buffer[5]&0x80
(用于小端)?
buffer[8]
超出范围,我想你对位编号感到困惑。我认为这个符号是位
63
(当然,它反映在有效位之上的所有低位)。Yop,你是对的。我更正了它。如果数字是2的补码,并且4个最高有效字节都是零(符号位除外),那么它超出了4字节整数可以表示的值范围。为什么要在字节数组中存储64位值,而不是
long
int64_t
?然后该值可以简单地进行类型转换。因为它是嵌入式设备,我不能使用64位变量。(最大32位)
buffer[8]
超出了范围,我认为您对位编号感到困惑。我认为这个符号是位
63
(当然,它反映在有效位之上的所有低位)。Yop,你是对的。我更正了它。如果数字是2的补码,并且4个最高有效字节都是零(符号位除外),那么它超出了4字节整数可以表示的值范围。为什么要在字节数组中存储64位值而不是