首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么gcc认为0x800000000000000000LL不签长?

为什么gcc认为0x800000000000000000LL不签长?
EN

Stack Overflow用户
提问于 2018-10-26 10:16:03
回答 1查看 552关注 0票数 5

我正在编译一段代码,其中使用0x8000000000000000LL文字的值来标识未知/不受支持的值。

LL后缀表示应该将该值解释为a (signed) long long (int),但是gcc (我尝试了4.8.5和4.1.1)表示该值属于unsigned long long类型。

我在这里放了一个示例代码:

代码语言:javascript
复制
#include <stdio.h>

#define UNKNOWN 0x8000000000000000LL

int main(void){
  long long value = 1000;

  if ((unsigned long long) value == UNKNOWN) {
    puts("Yes, they are different!!");
  }

  if (value == (long long) UNKNOWN) {
    puts("Yes, they are different!!");
  }

  if (value == UNKNOWN) {
    puts("Yes, they are different!!");
  }
  return 0;
}

使用此命令gcc -Wsign-compare ll.c编译的结果如下:

代码语言:javascript
复制
ll.c: In function ‘main’:
ll.c:16:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (value == UNKNOWN) {
             ^

为什么0x8000000000000000LL文本值被认为是无符号的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-26 10:21:22

因为它适用于十六进制或八进制的整数文本,不适合后缀所建议的整数类型。

6.4.4.1p5

整数常量的类型是可以表示其值的对应列表中的第一个。

注意,与十进制整数文本不同,没有u/U后缀的十六进制和八进制文本在搜索合适的类型时,可以在升序到下一个更高的有符号整数类型之前翻转类型符号。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53006486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档