Здравствуйте, Sir Wiz, Вы писали:
SW>Предпосылки следующие:
SW>"sizeof(char) is 1" по стандарту, 5.3.3/1
SW>Тип byte в стандарте не описан. (Я не нашёл) SW>В винде вводится как SW>typedef unsigned char byte; // RPCNDR.H
SW>О байте говорится следующие: SW>"The fundamental storage unit in the C++ memory model is the byte" 1.7/1, SW>однако никто не говорит, что байт это 8 бит, напротив, SW>"A byte is at least large enough to contain any member of the basic execution character set and is composed of a contiguous sequence of bits, the number of wich is implmentation-defined" 1.7/1.
SW>То есть, не менее 7 бит (достаточно для "basic execution character set"), и только в MSDN говорится, что байт есть 8 бит. Однако, возможно и большее количество. Но sizeof(char) всегда будет 1. Значится, меряем в попугаях.
SW>Внимание, вопрос! Как узнать сколько бит в char?
Можно так :
char x=-1;
int n=0;
while(x>>1)
n++;
n - количество бит в char.
Здравствуйте, _nn_, Вы писали:
SW>>Внимание, вопрос! Как узнать сколько бит в char?
__>Можно так : __>
__>char x=-1;
__>int n=0;
__>while(x>>1)
__> n++;
__>n - количество бит в char.
__>
Нет, так нельзя. Это не работает.
Во-первых вы, наверное, имели в виду while(x >>= 1).
Во-вторых, правый сдвиг отрицательных чисел implementation-defined, стандарт, 5.8/3.
Например, VC6 на правый сдвиг -1 на 1 бит возвращает -1, получаем бесконечный цикл.
В-третьих, неплохо бы в данном случае уточнять signed char x=-1. знаковость или беззнаковость char implementation-defined, стандарт, 3.9.1/1
Тип byte в стандарте не описан. (Я не нашёл)
В винде вводится как
typedef unsigned char byte; // RPCNDR.H
О байте говорится следующие:
"The fundamental storage unit in the C++ memory model is the byte" 1.7/1,
однако никто не говорит, что байт это 8 бит, напротив,
"A byte is at least large enough to contain any member of the basic execution character set and is composed of a contiguous sequence of bits, the number of wich is implmentation-defined" 1.7/1.
То есть, не менее 7 бит (достаточно для "basic execution character set"), и только в MSDN говорится, что байт есть 8 бит. Однако, возможно и большее количество. Но sizeof(char) всегда будет 1. Значится, меряем в попугаях.
Здравствуйте, SergeMukhin, Вы писали:
SW>>Внимание, вопрос! Как узнать сколько бит в char? SM>CHAR_BIT SM>и без всяких предпосылок
Фи. Это же #define, да ещё из Си-библиотеки. Вобщем сплошной deprecated.
Вот концептуальное решение:
long bitsInChar = 1;
unsigned char temp = 1;
while (temp <<= 1)
++bitsInChar;
SW>> long bitsInChar = 1;
SW>> unsigned char temp = 1;
SW>> while (temp <<= 1)
SW>> ++bitsInChar;
SW>>
maq>А если платформа big endian?
Кажется, что это не имеет значения. low/big endian — способы расположения байт в больших структурах (word). Здесь же речь идёт об однобайтовом char. Байт, как я уже цитировал стандарт — непрерывная последовательность бит определяемой реализацией компилятора длины. Должно работать.
Здравствуйте, Sir Wiz, Вы писали:
SW>Здравствуйте, SergeMukhin, Вы писали:
SW>>>Внимание, вопрос! Как узнать сколько бит в char? SM>>CHAR_BIT SM>>и без всяких предпосылок SW>Фи. Это же #define, да ещё из Си-библиотеки. Вобщем сплошной deprecated.
Что-тоя не помню, чтобы эти дейфайны были depracated
Здравствуйте, Sir Wiz, Вы писали:
SM>>CHAR_BIT SM>>и без всяких предпосылок SW>Фи. Это же #define, да ещё из Си-библиотеки. Вобщем сплошной deprecated.
Здравствуйте, jazzer, Вы писали:
SW>>>>Внимание, вопрос! Как узнать сколько бит в char? SM>>>CHAR_BIT SM>>>и без всяких предпосылок SW>>Фи. Это же #define, да ещё из Си-библиотеки. Вобщем сплошной deprecated. J>Что-тоя не помню, чтобы эти дейфайны были depracated
...Там смайлик стоял.
Да, как написал SergeMukhin, эти дефайны из стандарта. Но из раздела 18.2.2 "C library", а как писал Страуструп в книге "Язык программирования С++", 3-е издание, эти библиотеки включены в стандарт исключительно ради совместимости с миллионами строк уже написаного кода, а в адрес #define ругался словом deprecated (Не уверен, что именно этим, я читал русский перевод).
Вообщем, это уже бесцельная философия, а SergeMukhin спасибо за ответ, про CHAR_BIT я не знал / забыл.
Здравствуйте, Sir Wiz, Вы писали:
SW>Здравствуйте, jazzer, Вы писали:
SW>>>>>Внимание, вопрос! Как узнать сколько бит в char? SM>>>>CHAR_BIT SM>>>>и без всяких предпосылок SW>>>Фи. Это же #define, да ещё из Си-библиотеки. Вобщем сплошной deprecated. J>>Что-тоя не помню, чтобы эти дейфайны были depracated SW>...Там смайлик стоял.
Смайлик смайликом, а ты народ все же не пугай, а то будут бояться пользоваться совершенно валидными вещами Стандарта :)
Здравствуйте, Sir Wiz, Вы писали:
SW>Здравствуйте, Вадим Никулин, Вы писали:
ВН>>Ну, разве это концептуально? Вот — в compile-time: SW>Да, это логичное и концептуальное воплощение моей мысли.
SW>Я думал над подобным, но думалки не хватило. Изучаю. +3
Начни с прочтения Александреску, думалка будет в другую сторону думать.
Здравствуйте, Sir Wiz, Вы писали:
SW>Здравствуйте, _nn_, Вы писали:
SW>>>Внимание, вопрос! Как узнать сколько бит в char?
__>>Можно так : __>>
__>>char x=-1;
__>>int n=0;
__>>while(x>>1)
__>> n++;
__>>n - количество бит в char.
__>>
SW>Нет, так нельзя. Это не работает.
SW>Во-первых вы, наверное, имели в виду while(x >>= 1).
Да, конечно. SW>Во-вторых, правый сдвиг отрицательных чисел implementation-defined, стандарт, 5.8/3.
Левый сдвиг значит надо сделать SW>Например, VC6 на правый сдвиг -1 на 1 бит возвращает -1, получаем бесконечный цикл. SW>В-третьих, неплохо бы в данном случае уточнять signed char x=-1. знаковость или беззнаковость char implementation-defined, стандарт, 3.9.1/1
Это пропущенно для краткости.
SW>Я писал пример рабочего кода.
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, Sir Wiz, Вы писали:
SW>>Здравствуйте, _nn_, Вы писали:
SW>>>>Внимание, вопрос! Как узнать сколько бит в char?
Поторопился... __>>>Можно так : __>>>
__>>>char x=+1;
__>>>int n=0;
__>>>while(x>>1)
__>>> n++;
__>>>n - количество бит в char.
__>>>
SW>>Нет, так нельзя. Это не работает.
SW>>Во-первых вы, наверное, имели в виду while(x >>= 1). __>Да, конечно. SW>>Во-вторых, правый сдвиг отрицательных чисел implementation-defined, стандарт, 5.8/3. __>Левый сдвиг значит надо сделать SW>>Например, VC6 на правый сдвиг -1 на 1 бит возвращает -1, получаем бесконечный цикл. SW>>В-третьих, неплохо бы в данном случае уточнять signed char x=-1. знаковость или беззнаковость char implementation-defined, стандарт, 3.9.1/1 __>Это пропущенно для краткости.
SW>>Я писал пример рабочего кода.
Заметил позже...