【问题标题】:what is the reason for these data variables declaration differention in CC中这些数据变量声明差异的原因是什么
【发布时间】:2021-06-13 12:07:35
【问题描述】:

unsigned short 上限为 65535,超过此数字以 0 开头;

unsigned short a = 65535;
printf("%d", a);

a = 65535

unsigned short a = 65536;
printf("%d", a);

a = 0

unsigned short a = 65537;
printf("%d", a);

a = 1

等等

但是......当声明带有计算(pow、乘法、加法等)时,数字没有超过上限。

unsigned short a = pow(2, 16) - 1;
printf("%d", a);

a = 65535

unsigned short a = pow(2, 16);
printf("%d", a);

a = 65535

unsigned short a = pow(2, 17);
printf("%d", a);

a = 65535 ...等等。

出现这种情况的原因是什么?

【问题讨论】:

  • @Cheatah 这不是问题所在。大多数现代编译器即使使用 -O0 也根本不会调用 pow。

标签: c c99


【解决方案1】:
  1. 如果要打印无符号值,请使用正确的格式说明符:
printf("%hu", a);
  1. unsigned short a = pow(2, 16);值 65536(或更大)不适合 unsigned short。根据@JohnBollinger 的说法,超出范围的浮点值的分配是undefined,并且根据优化级别或其他选项,两个不同的编译器甚至相同的编译器可能会产生不同的结果:

https://godbolt.org/z/TG9z8xhaG

gcc - 65535
clang - 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多