беззнаковый тип целочисленной константы - PullRequest
2 голосов
/ 04 июля 2019

Я запутался в типе целочисленной константы, как описано здесь :

В первой строке, если константа заканчивается без 'u', почему десятичная константа должна быть *Тип 1006 *, в то время как восьмеричная или шестнадцатеричная константа может иметь тип unsigned?

Я думаю, что при выборе константы в качестве неподписанной версии, если версия signed не подходит, возникают проблемы, например:

long long l1 = 0xffffffff + 0xffffffff;  // 0xffffffff is unsigned int
long long l2 = 4294967295 + 4294967295;  // 4294967295 is signed long 

l1 - это fffffffe, а l2 - 1fffffffe.и, очевидно, l1 не так

Ответы [ 2 ]

3 голосов
/ 04 июля 2019

Если бы я сказал, я бы ответил, что шестнадцатеричные и восьмеричные числа представляют битовую комбинацию более близко , чем десятичные, и поэтому комитет по стандартизации C решил, что шестнадцатеричные и октальные числа могут быть без знака даже без U суффикса.

Подумайте, сколько людей написали бы такой код:

uint32_t b = a & 0xFFFFFFF0;

uint32_t b = a & 4294967280; // or -15?
0 голосов
/ 04 июля 2019

Эта проблема вызывает больше проблем из-за использования неправильного типа для операций, чем константы, не являющиеся правильным типом.

// some_wide_type = some_narrow_type + some_narrow_type --> trouble
long long l1 = 0xffffffff + 0xffffffff;
long long l2 = 4294967295 + 4294967295;

Вместо этого выполняйте математику, используя целевой тип

long long l1 = 0LL + 0xffffffff + 0xffffffff;
long long l2 = 0LL + 4294967295 + 4294967295;

или используйте 1 тип (long long) вместо 3 (long long, unsigned long, long)

long long l1 = 0xffffffffLL + 0xffffffffLL;
long long l2 = 4294967295LL + 4294967295LL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...