签名与未签名的比较

时间:2016-01-02 00:16:22

标签: c

size_t a;
off_t b;
...
if(b<a) ...

正如预期的那样,编译器在此处发出“signed vs unsigned comparsion”警告,因为off_t已签名且size_t未签名。有没有办法在不使用intmax_t / uintmax_t和预处理器条件指令的情况下在任何平台上正常工作?

无论sizeof(size_t)和sizeof(off_t)等于什么,它都应该有效。它们可能具有任何值,例如:

sizeof(size_t)=4, sizeof(off_t)=8   (regular modern 32bit unix)
sizeof(size_t)=4, sizeof(off_t)=4   (older system)
sizeof(size_t)=8, sizeof(off_t)=4   (some 64bit system with 32bit filesystem support)

如果我只是相互转换,可能会发生数据丢失和不正确的结果。

编辑要清楚:b的负值不是问题,因为负b很容易检测到(如果(b <0))并且总是小于无符号a的任何值。问题是两种类型的正值的比较,我不知道哪种类型的宽度更大。

EDIT2它与“将off_t和ssize_t与其他类型进行比较”不重复,因为该问题是关于比较带有各种位宽的带符号类型,这是关于有符号和无符号类型的;并且该问题的第一个答案也没有回答这个问题,因为答案是关于两个相同大小的类型,这里有两个未知大小的类型; 这个问题不只是关于比较,而是关于避免警告

2 个答案:

答案 0 :(得分:2)

package so_question01;

import java.io.*;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.*;
import javafx.collections.ObservableList;
import javafx.collections.FXCollections;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class TestApp extends Application {

    private Stage primaryStage;
   private  ObservableList<CargoItem> cargoData = FXCollections.observableArrayList(); 

   public TestApp() {
      // create some sample data
        CargoItem cargoInstance0 = new CargoItem("Toxic waste", 5000f);
        CargoItem cargoInstance1 = new CargoItem("Cement", 10000f);
        CargoItem cargoInstance2 = new CargoItem("Wheat", 20000f);
        cargoData.add(cargoInstance0);
        cargoData.add(cargoInstance1);
        cargoData.add(cargoInstance2);
   }

    /**
     * Returns the data as observable lists of objects. 
     * @return
     */
    public ObservableList<CargoItem> getCargoData() {return cargoData; }   //called in the controller

   @Override
   public void start(Stage primaryStage) { 
        this.primaryStage = primaryStage;
      this.primaryStage.setTitle("**** TEST ****");   
      show();
    }

      /**
     * Initializes the root layout.
     */
    public void show() {
        try {
            // Load root layout from fxml file.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(TestApp.class.getResource("Table_test02.fxml"));
            AnchorPane root = (AnchorPane) loader.load();

            // Give the controller access to the main app.
            ControllerTest controller = loader.getController();
            controller.setMainApp(this);

            // Show the scene containing the root layout.
            Scene scene = new Scene(root);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (IOException e) { System.out.println(e);}
    } 

   /**
     * Returns the main stage.
     * @return
     */
    public Stage getPrimaryStage() {
        return primaryStage;
    }

    public static void main(String[] args) { 
        Application.launch(TestApp.class, (java.lang.String[])null);
    }   
}

应该适用于所有情况。

如果if(b < 0 || (b <= SIZE_MAX && (size_t)b < a)) 为否定,那么显然它会低于b,因为a不能为负(因为a是无符号的)。

如果size_t大于b,那么显然它大于SIZE_MAX,因为a不能大于a

否则,它们都在SIZE_MAX的有效范围内,因此将它们作为size_t进行比较就足够了。

答案 1 :(得分:0)

没有

问题在于&#39;任何价值观&#39;包括否定的,在这种情况下,您必须应用特殊代码来处理它,因为底层机器没有。

如果您知道您的值是非负的,那么只需将它们转换为与最大操作数匹配的无符号类型。