我已经尽一切努力弄清楚了这一点,但我没有发现我做错了什么。转换为带符号可以使所有内容都超出数字十六进制值,而且我知道如果我有一个整数,可以直接使用“ 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,现在我可以看到结果了,但是即使将温度位偏移,我也看不到时钟发生任何变化
答案 0 :(得分:0)
这是修改版:
#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时增加分钟,依此类推)