如何将size_t和pid_t与int进行比较

时间:2009-11-21 15:33:03

标签: c

使用size_tpid_t类型的逻辑运算符的正确方法是什么? 我的意思是:写下以下内容是合法的吗? e.g:

size_t sz;  
/* some kind of assignment */  
if(sz > 0){  
  /* do something */  
}  

e.g:

void f(pid_t pid,...){  
  if(pid > 0){  
    /* do something */  
  }  
  /* ... */  
}

..或者我必须做一些演员?

修改
好的答案;
现在,考虑到被告知的事情,有人可以给我一个编码的理由:

void *my_malloc(size_t size){
  if(size <= 0){
    return NULL;
  }
  /* something else... */
}  

我的老师写了那段代码 它有意义吗?
我不知道为size_t类型保留了多少位(它依赖于实现)
但肯定是一个未签名的(你的答案),为什么上面这个表达?

4 个答案:

答案 0 :(得分:6)

是的,这是合法的。在进行比较之前,>的两个参数都将被提升为匹配类型。

请注意,对于size_t等无符号类型,> 0表示与!= 0相同。

答案 1 :(得分:1)

size_tpid_t实际上是不同风格的整数值 - 所以是的。

据我所知,实际上,它们背后的重点是size_tpid_t的风格可能在实现,操作系统和体系结构(例如,32位v 64位)和诸如此类的东西。

答案 2 :(得分:0)

在C中,size_t是无符号类型,其大小是int类型在底层架构上的大小。

因为C是弱类型的,所以你可以将有符号整数赋给size_t类型。正确使用类型的责任部分取决于程序员。

在您的情况下,因为您将size_t类型与零进行比较,所以很好。尝试将其与负数进行比较。你会感到惊讶。

答案 3 :(得分:0)

只要您记住size_t值将隐式转换为无符号类型(从int开始,将int值与size_t值进行比较就没有问题是未签名的。)

由于上述原因,当您在比较中混合使用有符号和无符号类型时,某些编译器会发出警告。在这种情况下,为了抑制警告,您必须将签名值显式转换为适当的无符号类型。但是,当签名值是非负编译时常量时,这些编译器通常不会发出任何警告,这意味着在您的示例中,不需要将显式0转换为无符号类型(或使用{{ 1}})。