【问题标题】:Attribute to a variable another variable of different type一个变量的属性另一个不同类型的变量
【发布时间】:2019-08-05 23:06:11
【问题描述】:

这个操作每次都有效吗?

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 位变量?

【问题讨论】:

  • 假设小端字节顺序也可能是0000 0111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

标签: c variables types bit-manipulation


【解决方案1】:

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

您应该注意,如果x 的值为,它将被符号扩展。例如,值 -16(二进制:1111 1111 1111 0000)将转换为 64 位 -16(1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 04020@9876 无符号) .您可以通过将x 设为无符号来避免这种情况。

【讨论】:

  • 好的,所以 p64 = x 是一种将 16 位变量(如 short int)转换为 64 位变量(如 unsigned long long)的好方法?
【解决方案2】:

当分配给任何无符号类型时

..新类型是无符号的,值1是在新类型能表示的最大值的基础上反复加减1,直到值在范围内新类型。 C17dr § 6.3.1.3 3

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

使用short,即有符号,正值将在没有值变化的情况下进行转换。否定的行为类似于p64 = neg_short + ULLONG_MAX + 1

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

细节:注意转换不是以位为单位定义的。


1 整数类型。

【讨论】:

    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 2011-03-27
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多