【问题标题】:In C, can you do this? int i; i = get_long() % 20;在 C 中,你能做到这一点吗?诠释我; i = get_long() % 20;
【发布时间】:2016-10-20 07:33:03
【问题描述】:
unsigned long get_long(); //returns some crazy large unsigned long

int i; 

i = get_long() % 20;

右侧的值应始终大到足以放入整数,因为可能的值只有 {0, 1, 2 .... 18, 19}。

我可以假设编译器可以将右侧的unsigned long 转换为左侧的整数吗?

【问题讨论】:

  • 什么是get_long?它不是标准功能。见How to Ask
  • big enough to fit into an integer...什么?
  • @WeatherVane 格式不正确。
  • get_long() 只是返回无符号长整数的函数的任意原型。
  • 启用编译器警告 (-Wall -Wextras -Wconversions) 看看。

标签: c types implicit-conversion


【解决方案1】:

是的,编译器将执行从unsigned long intint 的隐式转换(不强制转换),因为在您的情况下,int= 赋值运算符的目标类型.

INT_MAX 始终至少是32767,因此来自[0, 19] 的值将被保留。

【讨论】:

    【解决方案2】:

    是的,如果编译器符合标准。

    N1570 6.3.1.3 有符号和无符号整数,第 1 段说:

    当整数类型的值被转换为_Bool以外的其他整数类型时,如果 该值可以用新类型表示,它是不变的。

    根据 N1570 5.2.4.2.1 整数类型的大小 int 至少可以存储从 -32767 到 32767 的所有整数,将 0 到 19 范围内的整数转换为 int 是安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      相关资源
      最近更新 更多