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与其他类型进行比较”不重复,因为该问题是关于比较带有各种位宽的带符号类型,这是关于有符号和无符号类型的;并且该问题的第一个答案也没有回答这个问题,因为答案是关于两个相同大小的类型,这里有两个未知大小的类型; 这个问题不只是关于比较,而是关于避免警告
答案 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;包括否定的,在这种情况下,您必须应用特殊代码来处理它,因为底层机器没有。
如果您知道您的值是非负的,那么只需将它们转换为与最大操作数匹配的无符号类型。