Цитируется из вики:
C также предоставляет специальный тип элемента структуры, известный как битовое поле, которое является целым числом с явно указанным числом битов. Битовое поле объявляется как структурный член типа int, подписанный int, unsigned int или _Bool, после имени элемента стоит двоеточие (:) и количество битов, которое оно должно занимать. Общее количество битов в одном битовом поле не должно превышать общее количество битов в объявленном типе.
в операторе double a : 23;
вы используете битовое поле для double, что является ошибкой. Вместо этого следует использовать int.
Edit:
Поведение зависит от реализации и использует что-либо, кроме этих. Char может работать в вашей системе, но может не работать на другой платформе, поскольку не является частью стандарта.