【问题标题】:don't understand typecasting in C不懂 C 中的类型转换
【发布时间】:2015-10-04 18:38:53
【问题描述】:

我已经阅读了一些问题,但没有找到我想要的东西。 这是一个类型转换的示例(我在一些视频中看到过)

    int s = 45;
    double d = *(double *) &s;

(这个例子展示了如果你进行这种类型转换,数据是如何丢失的。) 但是我不明白上面的例子和这个有什么区别。

    int s = 45;
    double d = (double) &s;

或者这个

    int s = 45;
    double d = (double) s;

【问题讨论】:

  • 嗯,第二个结果是 45。第一个可能导致访问冲突,因为在大多数系统上 double 的宽度是 int 的两倍。
  • @Mitch 第二个不一定是45。
  • 不,它没有。我把它误读为(双)。我的错。
  • 理解这些例子需要理解地址操作符&和它的逆操作符,解引用操作符*。一旦你理解了他们在做什么,表达应该是清楚的。然后你需要阅读别名,以了解为什么你不应该做 1 或 2。

标签: c type-conversion


【解决方案1】:

在这个例子中:

int s = 45;
double d = (double) &s;

您使用& operator 获取s 的地址,然后将地址本身转换为double

第一种情况:

int s = 45;
double d = *(double *) &s;

您使用& operator 获取s 的地址,而不是引用此地址,就好像它指向双(double *) &s

现在您有一个指向 double 的指针,该指针与您的 int 所在的地址相同。

使用* 运算符,您可以获取此双指针中的值。

请注意,强制转换发生在取消引用之前!好像是:

int s = 45;
double d = *((double *) &s);

为了便于理解,我们可以分成几行:

int s = 45;
unsigned int addressOfS = &s;
double* pointerToTheSameNumAsPointerToDouble = (double*)addressOfS;
double theValueInThatPointer = *pointerToTheSameNumAsPointerToDouble;

【讨论】:

    【解决方案2】:

    (double *) &s 意味着我们将s 的内存地址转换为指向双精度的指针(因为s 实际上是双精度)。

    (double) &s 意味着我们将s 的内存地址转换为不正确的double(变量的内存地址应转换为指向该类型的指针) .

    例如:

    char s = 'c';
    char *s_pointer = (char *)&s;
    
    int t = 1;
    int *t_pointer = (int *)&t;
    

    等等等等

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 1970-01-01
      • 2010-11-23
      • 2010-09-23
      • 1970-01-01
      • 2022-08-27
      • 1970-01-01
      • 2012-02-23
      相关资源
      最近更新 更多