gpt4 book ai didi

c - 将 size_t 分配给 off_t 会产生符号转换错误

转载 作者:行者123 更新时间:2023-12-03 07:50:26 33 4
gpt4 key购买 nike

我正在使用以下版本的 gcc:

$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

考虑使用 -Werror=sign-conversion 编译的以下简单代码片段:

#include <stddef.h>
#include <sys/types.h>

int main(void){
size_t sz = sizeof(long);
off_t off_1 = sz; //error: conversion to 'off_t' {aka 'long int'} from 'size_t' {aka 'long unsigned int'} may change the sign of the result
off_t off_2 = sizeof(long); //compiles fine
return 0;
}

godbolt live example

根据N2596/6.5.3.4 sizeof_Alignof运算符:

The value of the result of both operators is implementation-defined,and its type (an unsigned integer type) is size_t, defined in<stddef.h> (and other headers).

所以在我看来 off_t off_1 = sz; 的结果应该与 off_t off_2 = sizeof(long); 相同

为什么off_t off_1 = sz;产生这个错误?

最佳答案

这一行:

off_t off_1 = sz;

产生错误,因为您系统上的 sz 是一个无符号 64 位值 (long unsigned int),并且 off_1 是一个有符号 64 位值 (long int)。一般情况下,sz 的某些值无法装入 off_1

但是在这一行中:

off_t off_2 = sizeof(long);

sizeof(long) 是一个编译时常量(在您的系统上为8),编译器可以验证它是否可以安全地分配给 off_t off_2

关于c - 将 size_t 分配给 off_t 会产生符号转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77285083/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com