Атрибут для переменной другой переменной другого типа - PullRequest
0 голосов
/ 15 марта 2019

Является ли эта операция действительной каждый раз?

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 голосов
/ 15 марта 2019

При присвоении любому без знака типу

.. новый тип является беззнаковым, значение 1 преобразуется путем многократного сложения или вычитания более одного максимального значения, которое может быть представлено в новом типе, до тех пор, пока значение не окажется в диапазоне Новый тип. C17dr § 6.3.1.3 3

Это означает, что unsigned long long p64 = any_integer_type четко определен.

При short, который подписан , положительные значения будут преобразованы без изменения значения. Негативы будут действовать как p64 = neg_short + ULLONG_MAX + 1.

В качестве побочного эффекта это выглядит как расширение знака бита для обычного short (дополнение 2 - без дополнения).

Подробности: обратите внимание, что преобразование не определяется в битах.


1 с целочисленным типом.

0 голосов
/ 15 марта 2019

Да, это действительно. 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 0000), даже если p64 не подписано , Вы можете избежать этого, сделав x без знака.

...