从‘void*’到‘int’的转换损失精度

╰+攻爆jí腚メ 2022-03-28 08:22 339阅读 0赞

在CentOS6.2 64位下编译一下代码,不通过,提示

./11_2.cpp: In function ‘int main(int, char**)’:
./11_2.cpp:28: 错误:从‘void*’到‘int’的转换损失精度
./11_2.cpp:31: 错误:从‘void*’到‘int’的转换损失精度

  1. 1 #include <unistd.h>
  2. 2 #include <cstdio>
  3. 3 #include <pthread.h>
  4. 4
  5. 5 using namespace std;
  6. 6
  7. 7 void *thr_fn1(void *arg)
  8. 8 {
  9. 9 printf("thread 1 returning\n");
  10. 10 return (void*)1;
  11. 11 }
  12. 12
  13. 13 void *thr_fn2(void *arg)
  14. 14 {
  15. 15 printf("thread 2 exiting\n");
  16. 16 pthread_exit((void*)2);
  17. 17 }
  18. 18
  19. 19 int main(int argc, char **argv)
  20. 20 {
  21. 21 pthread_t tid1, tid2;
  22. 22 void *tret;
  23. 23
  24. 24 pthread_create(&tid1, NULL, thr_fn1, NULL);
  25. 25 pthread_create(&tid2, NULL, thr_fn2, NULL);
  26. 26
  27. 27 pthread_join(tid1, &tret);
  28. 28 printf("thread 1 exit code %ld\n", (long)tret);
  29. 29
  30. 30 pthread_join(tid2, &tret);
  31. 31 printf("thread 2 exit code %ld\n", (long)tret);
  32. 32
  33. 33 return 0;
  34. 34 }

既然提示精度损失,那么看一下各自的精度即可:

  1. 1 #include <iostream>
  2. 2
  3. 3 using namespace std;
  4. 4
  5. 5 int main(int argc, char **argv)
  6. 6 {
  7. 7 cout << sizeof(int) << endl;
  8. 8 cout << sizeof(long) << endl;
  9. 9 cout << sizeof(void*) << endl;
  10. 10
  11. 11 return 0;
  12. 12 }

执行结果:

4
8
8

好吧,确实是精度损失了,从4个字节转换为8个字节。但是问题来了,为什么在64位下,指针是8个字节呢?

发表评论

表情:
评论列表 (有 0 条评论,339人围观)

还没有评论,来说两句吧...

相关阅读