C 是否未定义将32位整数复制到64位整数?

C 是否未定义将32位整数复制到64位整数?,c,int,C,Int,嗯,我知道你没有破坏任何东西,但是你也没有移动64位的数字。在C语言中,单个1默认为int。如果要将1用作unsigned long(或unsigned),请在数字后面加上(UL或U-(x86上的ULL)后缀,告诉编译器,否则将移动有符号的数字: uint64_t tmp = 1ULL << 31; 您没有损坏任何内容,但也没有移动64位数字。在C语言中,单个1默认为int。如果要将1用作unsigned long(或unsigned),请在数字后面加上(UL或U-(x86上的UL

嗯,我知道你没有破坏任何东西,但是你也没有移动64位的数字。在C语言中,单个
1
默认为
int
。如果要将
1
用作
unsigned long
(或
unsigned
),请在数字后面加上(
UL
U
-(x86上的
ULL
)后缀,告诉编译器,否则将移动有符号的数字:

uint64_t tmp = 1ULL << 31;

您没有损坏任何内容,但也没有移动64位数字。在C语言中,单个
1
默认为
int
。如果要将
1
用作
unsigned long
(或
unsigned
),请在数字后面加上(
UL
U
-(x86上的
ULL
)后缀,告诉编译器,否则将移动有符号的数字:

uint64_t tmp = 1ULL << 31;

哎呀。。。我差点忘了:sizeof(unsigned int)返回4。那个“损坏”实际上是。。。古怪的您可以发布一个源吗?是的,请参阅C标准中关于左移位运算符的描述(在C11中,它是6.5.7/4)。它是未定义的,因为31的幂2不能在有符号的int.Oops中表示。。。我差点忘了:sizeof(unsigned int)返回4。那个“损坏”实际上是。。。古怪的您可以发布一个源吗?是的,请参阅C标准中关于左移位运算符的描述(在C11中,它是6.5.7/4)。它是未定义的,因为2的31次幂不能用有符号整数表示:)天哪。很长一段时间以来,我一直认为左移在某种程度上是一种天生的无符号操作,因为它在其他方面对我来说仍然没有意义。非常感谢。我在等待堆栈溢出让我接受答案。我们都对这个问题感到困惑,包括我在内,直到有人告诉我们:
:p
也许更好,因为你知道你想要一个
uint64_t
结果,但你不知道是哪种预定义类型:
uint64_t tmp=(uint64_t)1:)天哪。很长一段时间以来,我一直认为左移在某种程度上是一种天生的无符号操作,因为它在其他方面对我来说仍然没有意义。非常感谢。我在等待堆栈溢出让我接受答案。我们都对这个问题感到困惑,包括我在内,直到有人告诉我们:
:p
也许更好,因为你知道你想要一个
uint64_t
结果,但你不知道这是哪种预定义类型:
uint64_t tmp=(uint64_t)1
uint64_t tmp = 1ULL << 31;
80000000