将 32 位整数复制到 64 位整数是未定义的吗?

标签 c int

嗯,我知道<< 32在 32 位整数上未定义...我也知道指针转换和取消引用不会混合太多。

但这一个不是他们中的任何一个。

测试.c:

#include <stdio.h>
#include <stdlib.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>

int main(void)
{
    uint64_t tmp = 1 << 31;
    printf("%" PRIx64 "\n", tmp);
    return 0;
}

然后我这样做:

$ gcc test.c -o test
$ ./test
ffffffff80000000

为什么它会破坏前 4 个字节?

低类工作正常。 如果我这样做 printf("%x\n", 1 << 31) ,它按预期产生 80000000。 如果 tmp 是 32 位,它也可以正常工作。

u64__u64也有这个怪癖。

最佳答案

您没有损坏任何东西,但您也没有移动 64 位数字。在 C 中,单个 1 默认为 int。如果您想将 1 用作 unsigned long(或 unsigned),请通过在数字后缀添加 (ULU --(x86 上的 ULL)),否则您将移动一个带符号的数字:

uint64_t tmp = 1ULL << 31;

输出

80000000

关于将 32 位整数复制到 64 位整数是未定义的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29551002/

相关文章:

c - 使用单链表实现 BinarySearchTree

清除Libcurl中的cookie文件

java - int 的哈希码

c - 如何用特定的整数值替换字符串中的字母?

c - 在字符串末尾添加字符

c - 有没有一种算法可以在线性时间内计算数组反转?

c - C 中的类型有任何保证的最小尺寸吗?

JAVA 检查字符串的特定格式?

python - 将 10 位无符号整数转换为 python 中的有符号整数

c++ - 在 C++ 中将一维数组转换为二维数组