如何在C中将无符号长移位?

时间:2018-11-01 07:25:53

标签: c long-integer bit-shift unsigned

我已经尽一切努力弄清楚了这一点,但我没有发现我做错了什么。转换为带符号可以使所有内容都超出数字十六进制值,而且我知道如果我有一个整数,可以直接使用“ ULL”将其转换并移位,但是我不知道

基本上

void   tick(unsigned long* tmp) { //input as a parameter
   signed long temp = tmp;

   printf("%x\n", temp >> 16 & 0xff);

   tmp = (signed) temp;

   return;
}

编辑:所以我很愚蠢,我应该用%lu而不是%x,现在我可以看到结果了,但是即使将温度位偏移,我也看不到时钟发生任何变化

2 个答案:

答案 0 :(得分:0)

  • 该函数参数是一个指针,因此您需要取消引用它才能访问它的值。
  • 如果要存储变量,则需要将位移后的值分配给变量。
  • 如果要在指针下更改值,则需要将新值分配给取消引用的指针
  • 您还需要使用长格式选项才能使其正确显示。 (在这里,lux->长无符号十六进制)

这是修改版:

#include <stdio.h>

void    tick(unsigned long* input)
{
  unsigned long temp;

  temp = ((*input) >> 16) & 0xff;
  printf("%lux\n", temp);

  *input = temp;
}

int main()
{
  long test = 1;
  tick(&test);
  test = 0b100000000000000000;
  tick(&test);
  test = 0b111111111111111111;
  tick(&test);
}

答案 1 :(得分:0)

根据注释中的信息,实际上您为每个字段(例如2个字节)布置了整数,例如小时/分钟/秒/上午-下午,每个字节2个字节(确保您的意思是2个字节,而不是2个半字节)。这个:

+--+--+--+--+--+--+--+--+
|H |H |M |M |S |S |AM PM|
+--+--+--+--+--+--+--+--+

您要提取包含秒的2个字节,然后将其加1。

您将需要8个字节(64位)来表示该值,因此我将使用uint64_t类型而不是无符号长类型,您将通过#include <stdint.h>获得uint64_t类型

void tick(uint64_t *value) { //input as a parameter
  //extract seconds 
  unsigned int seconds ((*value) >> 16) & 0xffff

  printf("seconds = %u\n", seconds);

 //add 1 second and pack the value back:
 seconds += 1;
 *value = (value & 0xffffffff0000ffff) | ((seconds & 0xffff) << 16);

 return; //returns void
}

(现在,您可能还需要处理换行,例如,当秒数达到60时增加分钟,依此类推)