有符号/无符号值与负值之间的比较

时间:2015-08-08 06:07:15

标签: c sizeof unsigned signed

计划1:

#include <stdio.h>
int main()
{
    if (sizeof(int) > -1)
        printf("Yes");
    else
        printf("No");
    return 0;
}

输出:No

计划2:

#include <stdio.h>
int main()
{
    if (2 > -1)
        printf("Yes");
    else
        printf("No");
    return 0;
}

输出:Yes

问题:

  1. 程序1和程序2有什么区别?
  2. 为什么sizeof(int)被视为unsigned
  3. 为什么程序2中的2被视为signed

3 个答案:

答案 0 :(得分:2)

签名和无符号整数之间的通常算术转换是常见问题。 sizeof运算符返回类型size_t的值,这是<stddef.h>中定义的一些实现定义的无符号整数类型(另请参阅this answer)。

整数常量-1的类型为int。当size_t实现为“至少”unsigned int时(在您的情况下很可能发生),则二进制运算符<的两个操作数都将转换为无符号类型。无符号值不能为负数,因此-1会被转换为大数。

答案 1 :(得分:1)

sizeof运算符返回的值类型为size_t,指定为无符号类型(通常等效于unsigned long)。

简单的普通整数文字,如2-1 始终类型为intint已签名。

如果您想要无符号整数文字,则必须添加U后缀,例如2U

答案 2 :(得分:0)

这是因为<html> <title></title> <head></head> <body> <?php $hostname = "localhost"; $database = "item_sales"; $username = "root"; $password = ""; $con = mysql_pconnect($hostname, $username, $password); error_reporting(0); ?> <form action="index.php" method="post" enctype="multipart/form-data"> <p>Customer Name : <input type="text" name="cus_name" /><br/><br/> </p> <p>Select an Item: <select name="iid"> <?php $sql = mysql_query("SELECT * FROM item"); mysql_select_db($database,$con); while($sqlv = mysql_fetch_array($sql)) { ?> <option id="<?php echo $sqlv['item_id']; ?>"><?php echo $sqlv['item_name']; ?></option> <?php } ?> </select> </p> <?php if(isset($_POST['submit'])) { $sql2 = "SELECT * FROM item WHERE iid='%item_id%'"; mysql_select_db($database,$con); $mydata = mysql_query($sql2); $cus_name = $_POST['cus_name']; $sql3 = "INSERT INTO customer (cus_id, iid, cus_name) VALUES ('', '$_POST[iid]', '$cus_name')"; mysql_query($sql3); } ?> <input type="submit" name="submit" value="Add Sale" /> </form> </body> </html> 运算符返回sizeof中的值。这应该是一个无符号类型,通常实现为size_t

数字unsigned int本身是2,而不是int