Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
#1

Почему после компиляции получаю число с=4 294 967 265 ? - C++

22.02.2014, 21:05. Просмотров 370. Ответов 17
Метки нет (Все метки)

C++
1
2
3
4
5
6
int main()
{
      char *s='c';//кирилица с маленькое
      int c=s;
            cout<<"c="<<c<<"\n";
}
Почему после компиляции получаю число с=4 294 967 265 ?
Я ожидал получить 225, в редакторе текстовый файл в котором есть буква "с" её отображает как 0xE1, если перевести в десятичные получаем 225.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2014, 21:05     Почему после компиляции получаю число с=4 294 967 265 ?
Посмотрите здесь:

Ошибки после компиляции C++
C++ Найдите простые троллейбусные билеты, если номера билетов принадлежат промежутку от «а» до «b».Счастливый билет 627 294, 6+2+7-2+9+4
При компиляции любого кода получаю ошибку C++
ошибок в компиляции нет, а при работе выходит ошибка, почему? C++
Выдает ошибку при компиляции. Не могу понять почему C++
Почему выдает такую ошибку? c++ при компиляции C++
Почему результат компиляции маленькой программы на с++ имеет довольно большой размер? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
22.02.2014, 21:06     Почему после компиляции получаю число с=4 294 967 265 ? #2
Цитата Сообщение от reef213 Посмотреть сообщение
Почему после компиляции получаю число с=4 294 967 265 ?
Потому что код с ошибками?
Что нужно получить-то?
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 476
Завершенные тесты: 1
22.02.2014, 21:08     Почему после компиляции получаю число с=4 294 967 265 ? #3
reef213, потому что char s = 'c'
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 21:10  [ТС]     Почему после компиляции получаю число с=4 294 967 265 ? #4
Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что код с ошибками?
Что нужно получить-то?
Я дописал что хотел получить
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
22.02.2014, 21:20     Почему после компиляции получаю число с=4 294 967 265 ? #5
Цитата Сообщение от reef213 Посмотреть сообщение
Я ожидал получить 225, в редакторе текстовый файл в котором есть буква "с" её отображает как 0xE1, если перевести в десятичные получаем 225.
char * - указатель на один символ или последовательность типа char.
Т.к. нужно получить символ, то
C++
1
2
char const * s = "c"; // внимание на кавычки - они двойные
int c = s[0]; // первый символ в строке
либо
C++
1
2
char s = 'c'; // один символ, кавычки одинарные
int c = s;
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 476
Завершенные тесты: 1
22.02.2014, 21:25     Почему после компиляции получаю число с=4 294 967 265 ? #6
Хотя с другой стороны непонятно - мы переменной char* s присвоили адрес 0xE1, и при присвоении к int c должно быть получено число 255. Странно, что в итоге такое число вышло.
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 21:25  [ТС]     Почему после компиляции получаю число с=4 294 967 265 ? #7
Цитата Сообщение от DrOffset Посмотреть сообщение
char * - указатель на один символ или последовательность типа char.
Т.к. нужно получить символ, то
C++
1
2
char const * s = "c"; // внимание на кавычки - они двойные
int c = s[0]; // первый символ в строке
либо
C++
1
2
char s = 'c'; // один символ, кавычки одинарные
int c = s;
Про ковычки я знаю, боюсь что тут дело в адресации памяти.То есть переменная лишнюю информацию получает из памяти.Как с этим бороться не знаю
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
22.02.2014, 21:30     Почему после компиляции получаю число с=4 294 967 265 ? #8
Цитата Сообщение от reef213 Посмотреть сообщение
То есть переменная лишнюю информацию получает из памяти.Как с этим бороться не знаю
Что? Вы просто банально присвоили адрес s переменой типа int c.
Никакой лишней информации. Просто ваш код делает не то, что вы думаете.
Наверняка еще компилятор вам кучу warning`ов написал на ваш код.
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 21:40  [ТС]     Почему после компиляции получаю число с=4 294 967 265 ? #9
Вот собственно листинг всей программы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>
#include <ios>
 
using  namespace std;
int main(){
    
    int i=0;
    char a[10000],
         b[100];
    unsigned int acode;  
        ifstream is("1.dbf");
        is.seekg (0, is.end);
    int l = is.tellg();
        is.seekg (0, is.beg);
    
        cout<<"lenght files="<<l<<"\n";
    char * buffer = new char [l];
    
    for(int i=0;i<l;i++) *buffer=*"";
    
    is.read (buffer,l);
    cout<<"type base:"<<dec<<buffer[0]<<"\n";   //Г’ГЁГЎ ГґГ*éëГ* ГЃГ„ Г§Г*Г*ГЁГ¬Г*ГҐГІ 1 ГЎГ*éò
    cout<<"date modification:";                 //Г„Г*ГІГ* ìîäèôèêГ*öèè Г§Г*Г*ГЁГ¬Г*ГҐГІ 3 ГЎГ*éòГ*
                        acode=buffer[3];
                        cout<<acode<<".";
                        acode=buffer[2];
                        cout<<acode<<".";
                        acode=buffer[1];
                        cout<<acode<<"\n";
    acode=buffer[4];
    cout<<"colum:"<<acode<<"\n";                //êîëè÷åñòâî Г§Г*ГЇГЁГ±ГҐГ© Г§Г*Г*ГЁГ¬Г*ГҐГІ 4 ГЎГ*éòГ*
    acode=buffer[8];                            //ÄëèГ*Г* Г§Г*ãîëîâêГ* Г§Г*Г*ГЁГ¬Г*ГҐГІ 2 ГЎГ*éòГ*
    cout<<"size heade:"<<acode<<"\n";       
 
//  system("Pause");
}
вот содержимое файла которое я считываю

0x03 0x71 0x0c 0x0c 0x06 0x00 0x00 0x00 0xe1 0x00 0x81 0x00
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
22.02.2014, 21:51     Почему после компиляции получаю число с=4 294 967 265 ? #10
Кроме очевидной ошибки в обнулении массива:
C++
1
for(int i=0;i<l;i++) *buffer=*""; // присваиваем 0 всегда первому символу в массиве
вместо этого написать так:
C++
1
for(int i=0;i<l;i++) buffer[i]= 0;
или вообще так:
C++
1
memset(buffer, 0, l);
пока не понятно какая конечная цель?
Вывести значения из файла как байт, три байта, четыре байт и два?
Или вывести побайтно все, что прочитано?
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 22:05  [ТС]     Почему после компиляции получаю число с=4 294 967 265 ? #11
Вывести по байтно все что прочитано

Добавлено через 3 минуты
DrOffset, не помогло
ValeryS
Модератор
6477 / 4943 / 455
Регистрация: 14.02.2011
Сообщений: 16,383
22.02.2014, 22:08     Почему после компиляции получаю число с=4 294 967 265 ? #12
Цитата Сообщение от reef213 Посмотреть сообщение
Вывести по байтно все что прочитано
ну и в чем сложности?
вот так ты считываешь
Цитата Сообщение от reef213 Посмотреть сообщение
is.read (buffer,l);
а вот так выводишь
C++
1
2
for(int i=0;i<l;i++)
  printf("%x ",buffer[i]);
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
22.02.2014, 22:11     Почему после компиляции получаю число с=4 294 967 265 ? #13
Цитата Сообщение от reef213 Посмотреть сообщение
DrOffset, не помогло
Оно и не поможет, потому что это только одна ошибка
См. ответ ValeryS для дальнейших шагов.
ValeryS
Модератор
6477 / 4943 / 455
Регистрация: 14.02.2011
Сообщений: 16,383
22.02.2014, 22:20     Почему после компиляции получаю число с=4 294 967 265 ? #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от reef213 Посмотреть сообщение
Почему после компиляции получаю число с=4 294 967 265 ?
число это в шеснадцетеричке FF FF FF E1
Цитата Сообщение от reef213 Посмотреть сообщение
//кирилица с маленькое
'с' маленькое это 225 или E1 число отрицательное для char(-31) и при увеличении до int тоже становится отрицательным
вот и получаешь код FF FF FF E1
а тут еще у тебя замутка с адресами и превращает из отрицательного большое положительное
попробуй вот так и почувствуй разницу
C++
1
2
3
4
5
6
char s='c';//кирилица с маленькое
int c=s;
 cout<<"c="<<c<<"\n";
unsigned char s1='c';//кирилица с маленькое
int c1=s1;
 cout<<"c="<<c<<"\n";
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 22:21  [ТС]     Почему после компиляции получаю число с=4 294 967 265 ? #15
DrOffset, с выводом все ясно как день, а что на счет того что бы представить массив символов HEX в dec виде? Поэтому у меня и стоит присвоение переменной типа unsigned int
ValeryS
Модератор
6477 / 4943 / 455
Регистрация: 14.02.2011
Сообщений: 16,383
22.02.2014, 22:30     Почему после компиляции получаю число с=4 294 967 265 ? #16
Цитата Сообщение от reef213 Посмотреть сообщение
Поэтому у меня и стоит присвоение переменной типа unsigned int
но переменная то у тебя char а не unsigned char
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 22:31  [ТС]     Почему после компиляции получаю число с=4 294 967 265 ? #17
ValeryS, Спасибо!Все выводится как надо, написал так.

Кому интересно пишу программу для парсинга и обработки dbf файлов.

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>
#include <ios>
 
using  namespace std;
int main(){
    
    int i=0;
    char a[10000],
         b[100];
    unsigned int acode;  
        ifstream is("8616M1212_.dbf");
        is.seekg (0, is.end);
 int l = is.tellg();
        is.seekg (0, is.beg);
    
        cout<<"lenght files="<<l<<"\n";
 char * buffer = new char [l];
    
    //for(int i=0;i<l;i++) buffer[i]=0;
    
  memset(buffer, 0, l);
 
    is.read (buffer,l);
    cout<<"type base:"<<dec<<buffer[0]<<"\n";   //Тиб файла БД занимает 1 байт
    cout<<"date modification:";                 //Дата модификации занимает 3 байта
                        acode=buffer[3];
                        cout<<acode<<".";
                        acode=buffer[2];
                        cout<<acode<<".";
                        acode=buffer[1];
                        cout<<acode<<"\n";
    acode=buffer[4];
    cout<<"colum:"<<acode<<"\n";                //количество записей занимает 4 байта
    unsigned char temp=buffer[8];
    acode=temp;                         //Длина заголовка занимает 2 байта
    cout<<"size heade:"<<acode<<"\n";       
 
//  system("Pause");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2014, 22:38     Почему после компиляции получаю число с=4 294 967 265 ?
Еще ссылки по теме:

Мусор после компиляции C++
C++ Почему не показывается количество единиц при компиляции? в числе 017 их 4(1111)
После компиляции вылетает пустая консоль! Почему так? C++
Почему после 51-го знака после запятой выводятся одни нули? C++
Подскажите почему выдается ошибка компиляции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6477 / 4943 / 455
Регистрация: 14.02.2011
Сообщений: 16,383
22.02.2014, 22:38     Почему после компиляции получаю число с=4 294 967 265 ? #18
Цитата Сообщение от reef213 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
cout<<"type base:"<<dec<<buffer[0]<<"\n"; //Тиб файла БД занимает 1 байт
 cout<<"date modification:"; //Дата модификации занимает 3 байта
  acode=buffer[3];
  cout<<acode<<".";
  acode=buffer[2];
  cout<<acode<<".";
  acode=buffer[1];
  cout<<acode<<"\n";
  acode=buffer[4];
 cout<<"colum:"<<acode<<"\n";  //количество записей занимает 4 байта
  acode=buffer[8];
вот это все не мучался бы и записал структурой
C++
1
2
3
4
5
6
7
struct buf
{
unsigned char type;
unsigned char data[3];
int colum;
......................
}
а потом применил бы объединение
C++
1
2
3
4
5
6
union BUF
{
 buf;
unsigned char bt[sizeof(buf)];
 
}
Добавлено через 2 минуты
Цитата Сообщение от reef213 Посмотреть сообщение
пишу программу для парсинга и обработки dbf файлов.
сам Билл велел пользовать структуру
Yandex
Объявления
22.02.2014, 22:38     Почему после компиляции получаю число с=4 294 967 265 ?
Ответ Создать тему
Опции темы

Текущее время: 14:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru