十六进制的无符号长整数的值是多少

时间:2013-08-20 05:27:27

标签: c floating-point embedded printf

我有这个变量

unsigned long long latitude = 29.47667;

当我将此值转换为此类数据时

    ar[7] = (uint8_t)((latitude >> 56) & 0xFF);
    ar[6] = (uint8_t)((latitude >> 48) & 0xFF);
    ar[5] = (uint8_t)((latitude >> 40) & 0xFF);
    ar[4] = (uint8_t)((latitude >> 32) & 0xFF);
    ar[3] = (uint8_t)((latitude >> 24) & 0xFF);
    ar[2] = (uint8_t)((latitude >> 16) & 0xFF);
    ar[1] = (uint8_t)((latitude >> 8) & 0xFF);
    ar[0] = (uint8_t)(latitude & 0xFF);

然后使用tcp socket将其发送到服务器。当我发送时,我以十六进制打印值,然后我0x1d全部为零。

如何在将unsigned long long转换为int时将确切的值发送到服务器。

4 个答案:

答案 0 :(得分:6)

unsigned long long latitude = 29.47667没有多大意义,unsigned long long是整数类型。因此变量只获得截断的整数29

这就是为什么你只得到0x1d,这只是十六进制的29

答案 1 :(得分:4)

逐字节读取双值:

double val = 29.47667;
double *ptr = &val;
uint8_t bytes[8];
register int i;

for(i = 0; i < 8; ++i)
{
   bytes[i] = *(((uint8_t*)ptr) + i);
   printf("%hhu", bytes[i]);
}

不要将unsigned long long类型用于十进制值

另一种方法(如果不修改来源):

double val = 29.47667;
double *ptr = &val;
uint8_t *cptr = (uint8_t*)ptr;

现在直接使用*(cptr + i)来访问/发送字节 i的值。

答案 2 :(得分:2)

将double转换为hex,然后将hex转换为double。

使用double覆盖64位整数。这假设double是8字节。如果double不同,可以轻松覆盖其他整数。

通过tcp套接字发送整数,并根据需要重新构建。

// 29.47667
403D7A070B8CFBFC
2.94766699999999986e+01

#include <stdio.h>
#include <float.h>
#include <inttypes.h>

uint64_t MakeHex(double d) {
  union {
      double d;
      uint64_t u;
  } x;
  x.d = d;
  return x.u;
}

double MakeD(uint64_t u) {
  union {
      double d;
      uint64_t u;
  } x;
  x.u = u;
  return x.d;
}
int main() {
  uint64_t u = MakeHex(29.47667);
  printf("%0" PRIX64 "\n", u);
  double d = MakeD(u);
  printf("%.*le\n", DBL_DIG+2, d);
  return 0;
}

答案 3 :(得分:-3)

您可以通过将其包含在任何头文件中来调用此函数

void dec_hex(long int num)      // Function Definition
{
long int rem[50],i=0,length=0;
while(num>0)
   {
      rem[i]=num%16;
      num=num/16;
      i++;
      length++;
   }

printf("Hexadecimal number : ");

for(i=length-1;i>=0;i--)
  {
    switch(rem[i])
    {
      case 10:
          printf("A");
          break;

      case 11:
          printf("B");
          break;

      case 12:
          printf("C");
          break;

      case 13:
          printf("D");
          break;

      case 14:
          printf("E");
          break;

      case 15:
          printf("F");
          break;

      default :
         printf("%ld",rem[i]);
    }
  }
}