【发布时间】:2016-07-20 21:51:13
【问题描述】:
#include <stdio.h>
int main() {
int i,n;
int a = 123456789;
void *v = &a;
unsigned char *c = (unsigned char*)v;
for(i=0;i< sizeof a;i++) {
printf("%u ",*(c+i));
}
char *cc = (char*)v;
printf("\n %d", *(cc+1));
char *ccc = (char*)v;
printf("\n %u \n", *(ccc+1));
}
这个程序在我的 32 位 Ubuntu 机器上生成以下输出。
21 205 91 7
-51
4294967245
前两行输出我能理解 =>
- 第一行:字节在内存中的存储顺序。
- 第二行:第二个字节值的有符号值(2 的补码)。
- 第三行:为什么会有这么大的价值?
请解释输出的最后一行。为什么要添加三个字节的 1
因为(11111111111111111111111111001101) = 4294967245。
【问题讨论】:
-
因为
%u用于无符号整数,而您的*(ccc+1)是负字符。无符号整数大小比 Char 大小长,所以有填充。由于您的 char 是负数,所以有1填充,因为正字符会有0填充。
标签: c++ c pointers char pointer-arithmetic