加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么只有在x64下编译时才会生成编译器警告“Signed / Uns

发布时间:2020-12-16 10:15:53 所属栏目:百科 来源:网络整理
导读:考虑以下代码: LARGE_INTEGER l;size_t s;if (s l.QuadPart) return 1;return 0; 当在x64下编译时,它会生成C4018签名/无符号不匹配编译器警告(忽略未初始化的本地变量警告). 警告很好,因为QuadPart是LONGLONG,签名且size_t是无符号的. 但是当我在32位下编译
考虑以下代码:

LARGE_INTEGER l;
size_t s;
if (s < l.QuadPart) return 1;
return 0;

当在x64下编译时,它会生成C4018签名/无符号不匹配编译器警告(忽略未初始化的本地变量警告).

警告很好,因为QuadPart是LONGLONG,签名且size_t是无符号的.

但是当我在32位下编译它时没有警告?怎么会?在32位下,LONGLONG仍然是签名的,size_t是未签名的.

解决方法

在32位LONGLONG相当于signed __int64,size_t相当于unsigned int. unsigned int具有完全符合signed __int64范围的范围,因此编译器在比较之前将size_t扩展(对整数提升)size_t为signed __int64并且没有警告.

在64位LONGLONG上再次等同于signed __int64,但size_t等同于unsigned __int64,所以现在size_t不再适合LONGLONG,并且编译器不能自动执行任何类型的提升,因此警告.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读