奇怪的类型转换行为

时间:2019-05-20 19:30:29

标签: c casting

我有此代码:

#include <stdio.h>

int func(unsigned int *a) {
  printf("(func) Value: %d\n", *a);
}

int main() {
  unsigned char a = 255;

  printf("Value: %d\n", a);
  printf("Bytes: %d %d %d %d\n\n", *&a, *(&a + 1), *(&a + 2), *(&a + 3));

  func((unsigned int *) &a);

  return 0;
}

我有这个程序的输出:

Value: 255
Bytes: 255 0 22 234

(func) Value: -367656705

为什么类型为unsigned int,我却具有负的func值?

2 个答案:

答案 0 :(得分:1)

  

为什么类型为unsigned int,我却具有负的func值?

int func(unsigned int *a) {
  printf("(func) Value: %d\n", *a);
  //                    ^^
}

因为%d*a的类型不匹配

答案 1 :(得分:0)

因为sizeof(unsigned char)和sizeof(unsigned int)是不同的,并且也可能与平台有关。例如,无符号字符可以是1个字节。 unsigned int可以是4个字节。当您执行指针算术时,您可能正在查看堆栈框架中的其他内容。 C为您提供了很多绳子供您垂吊。