C int64_t的宽度,是否始终为64位?

C int64_t的宽度,是否始终为64位?,c,gcc,x86,C,Gcc,X86,对于以下代码 static inline float fix2float(int64_t f) { return (float)f / (1 << 60); // <-- error here } 当64>60时,为什么编译器会发出这些警告?1不是C实现中的64位数字。它是一个int,可能是32位 编译器不会查看表达式并查看是否包含int64\t,因此其他算术运算应该使用64位。它从它们的部分构建表达式。在代码的(1部分中,存在与int64_t实际无关的错误。(1在所

对于以下代码

static inline float fix2float(int64_t f)
{
    return (float)f / (1 << 60); // <-- error here
}

当64>60时,为什么编译器会发出这些警告?

1
不是C实现中的64位数字。它是一个
int
,可能是32位


编译器不会查看表达式并查看是否包含
int64\t
,因此其他算术运算应该使用64位。它从它们的部分构建表达式。在代码的
(1部分中,存在与int64_t实际无关的错误。
(1在所有情况下,您都可以使用格式化
int64_t
,无需假定它是
long
的别名。使用值1编写
int64_t
常量的正确方法是
int64_C(1)
,而不是
1LL
。它的正确格式说明符是
PRId64
,如
printf(“%”PRId64“\n”,…)
,当然,在
之后包含
。另外,
x
用于无符号。如果你想用十六进制打印
int64\u t
,你应该将它转换成
uint64\u t
并用
PRIx64
+1打印:我不知道C99十六进制指数的语法。。。。(也就是说,我不认为在没有明显的代码注释来解释魔力的情况下使用这种语法)@NormanGray:它已经成为语言的一部分13年了。它几乎不是“魔力”。它是C–只有13年意味着它算是一种新奇(记住,一些人仍然认为非K&R C是一个相当大胆的想法).但说真的,就我所知,这种语法是C语言所独有的,而且它至少有点神秘,因此一个突出的注释对代码的最终读者来说是文明的。
warning: left shift count >= width of type
warning: division by zero
#include <stdio.h>

int main()
{
    printf("%llx\n", (1LL << 60));
    return 0;
}
printf("%" PRIx64 "\n", (UINT64_C(1) << 60));