变量的属性另一个不同类型的变量

时间:2019-03-14 22:25:17

标签: c variables types bit-manipulation

此操作每次都有效吗?

unsigned long long p64 = 0;
short int x = 7;

p64 = x;

因此,在此示例中,p64变量将始终是该变量?

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111

这意味着

(p64 == 7)

我问这个问题,因为有时0111之后的位全为1,而不是0。但是gcc编译器没有显示警告,因此该操作每次都有效吗?您有解决方案将16位变量转换为64位变量吗?

2 个答案:

答案 0 :(得分:0)

是的,这是有效的。 p64的值始终为7。

您应注意,如果receive-alert的值为,则将其符号扩展。即使x,例如值-16(以二进制形式:1111 1111 1111 0000)也将转换为64位-16(-1611 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000)未签名。您可以通过使p64未签名来避免这种情况。

答案 1 :(得分:0)

分配给任何 unsigned 类型

  

..新类型是无符号的,值 1 的转换是通过反复添加或减去比新类型可表示的最大值多一个,直到该值在新类型。 C17dr§6.3.1.3 3

这意味着unsigned long long p64 = any_integer_type的定义正确。

对于short,其为签名,正值将转换而不会改变值。否定词的行为类似于p64 = neg_short + ULLONG_MAX + 1

作为副作用,这看起来像是普通short(2的补码-未填充)的位符号扩展。

详细信息:请注意,转换不是按位定义的。


1 具有整数类型。