说我有这段代码:
char num[2] = {15, 240};
char* p_num;
现在,如果我已经理解了一切正确,那么数组中的位应该像这样对齐:
00001111 11110000
我的问题是:是否有任何可能的方法使指针p_num指向第一个字节中的最后四位,以便在执行此代码时:
printf("%d", *p_num);
将写入255?
即。 p_num将指向下面括号括起的位:
0000[1111 1111]0000
答案 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
来存储240
和255
,因为char
可以根据实施情况进行签名或取消签名。
答案 1 :(得分:0)
不,有两个原因。
char
的大小定义为1.但是,单位本身是依赖于实现的。 C不保证它将是1 字节。当然,单位通常为1个字节。但是,由于无法保证这一点,您的前提是数组字节中的位将按您认为的方式排列并不准确。严格来说,这些位本身可以包含任何东西。虽然根据语言你可能不会依赖来处理那些排列的东西是不寻常的。任何依赖于位移等的解决方法都将可靠地仅在该实现上工作,并且不能被认为是可移植的。 char
的指针只会指向char
。如果使用指针算法推进它,它将按实现定义的单位提前1。对于任何其他类型的指针也是如此。语言无法通过指针指向的任何类型大小的分数来推进指针。