这是我的计划的一部分:
while((total_bytes_read != fsize) && ((nread = read(f_sockd, filebuffer, fsize_tmp)) > 0)){
if(write(fd, filebuffer, nread) != nread){
perror("write RETR");
onexit(f_sockd, 0, 0, 1);
}
total_bytes_read += nread;
fsize_tmp -= nread;
}
其中total_bytes_read, fsize, nread
被声明为uint32_t
。
在64位计算机上没有问题,它编译并运行得很好(这部分代码必须接收文件)。问题是当我在32位机器上编译时因为我收到了这个错误:
warning: comparison of integers of different signs: 'ssize_t' (aka 'int') and 'uint32_t' (aka 'unsigned int') [-Wsign-compare] if(write(fd, filebuffer, nread) != nread){
我不知道如何解决这个问题,因为如果我改变{{1} if(write(fd, filebuffer, nread) != nread){
程序不再接收该文件,但它将(部分)文件内容打印到stdout。
为什么我会遇到这种奇怪的行为?我怎么能解决这个问题?
答案 0 :(得分:3)
只需使用正确的类型。 The standard说:
ssize_t read(int fildes, void *buf, size_t nbyte);
^^^^^^^ ^^^^^^
这就是你应该使用的东西。不是int
,不是uint64_t
,不是unsigned long long
等。