此操作每次都有效吗?
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位变量吗?
答案 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 具有整数类型。