将char *更改为指向偏移的几位

时间:2017-02-10 22:20:24

标签: c arrays pointers byte bit

说我有这段代码:

char  num[2] = {15, 240};
char* p_num;

现在,如果我已经理解了一切正确,那么数组中的位应该像这样对齐:

00001111 11110000

我的问题是:是否有任何可能的方法使指针p_num指向第一个字节中的最后四位,以便在执行此代码时:

printf("%d", *p_num);

将写入255?

即。 p_num将指向下面括号括起的位:

0000[1111 1111]0000

2 个答案:

答案 0 :(得分:6)

没有。内存的最小可寻址单位是一个字节(最多),但您可以使用

获得所需的值
((num[0] & 0xF) << 4) | ((num[1] >> 4) & 0xF)

例如,

unsigned char num[2] = {15, 240};
unsigned char combined = ((num[0] & 0xF) << 4) | ((num[1] >> 4) & 0xF);
printf("%d\n", (int)combined);

请注意,我使用unsigned char来存储240255,因为char可以根据实施情况进行签名或取消签名。

答案 1 :(得分:0)

不,有两个原因。

  1. 在C中,char的大小定义为1.但是,单位本身是依赖于实现的。 C不保证它将是1 字节。当然,单位通常为1个字节。但是,由于无法保证这一点,您的前提是数组字节中的位将按您认为的方式排列并不准确。严格来说,这些位本身可以包含任何东西。虽然根据语言你可能不会依赖来处理那些排列的东西是不寻常的。任何依赖于位移等的解决方法都将可靠地仅在该实现上工作,并且不能被认为是可移植的。
  2. 指向char的指针只会指向char。如果使用指针算法推进它,它将按实现定义的单位提前1。对于任何其他类型的指针也是如此。语言无法通过指针指向的任何类型大小的分数来推进指针。