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

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

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

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

22.02.2014, 21:05. Просмотров 394. Ответов 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.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2014, 21:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему после компиляции получаю число с=4 294 967 265 ? (C++):

После компиляции вылетает пустая консоль! Почему так? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; int _tmain(int argc, _TCHAR* argv) { int c, i, nwhite,nother; int...

При компиляции любого кода получаю ошибку - C++
При компиляции любого кода получаю ошибку C:\Users\Mefelis\Documents\Makefile.win Error 1

После повторной компиляции при запуске приграммы получаю CRASH - C++ Builder
Запускаю билдер, открываю проект, дописываю код. Компилирую и запускаю программу. Программа открывается нормально, всё работает как и...

Почему после компиляции не запускается программа ? - C#
Доброго времени суток. Проблема следующая: программа тестирования обращается к xml-файлу. Без его использования запускается, но, при его...

Почему некоторые компоненты после компиляции программы прозрачные? - Delphi
В общем вся суть проблемы в названии темы. После компиляции проги компоненты: скролбар,листбок и трэкбар прозрачные!! Использую...

Почему после компиляции стиль оформления становится как у Win2000 - C#
Всем привет. Задался вопросом почему все мои написанные программы оформлением напоминают Винду ХР, а не 7-ку, хотя в конструкторе все...

17
DrOffset
7320 / 4420 / 1001
Регистрация: 30.01.2014
Сообщений: 7,258
22.02.2014, 21:06 #2
Цитата Сообщение от reef213 Посмотреть сообщение
Почему после компиляции получаю число с=4 294 967 265 ?
Потому что код с ошибками?
Что нужно получить-то?
0
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
22.02.2014, 21:08 #3
reef213, потому что char s = 'c'
1
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 21:10  [ТС] #4
Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что код с ошибками?
Что нужно получить-то?
Я дописал что хотел получить
0
DrOffset
7320 / 4420 / 1001
Регистрация: 30.01.2014
Сообщений: 7,258
22.02.2014, 21:20 #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;
0
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
22.02.2014, 21:25 #6
Хотя с другой стороны непонятно - мы переменной char* s присвоили адрес 0xE1, и при присвоении к int c должно быть получено число 255. Странно, что в итоге такое число вышло.
0
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 21:25  [ТС] #7
Цитата Сообщение от DrOffset Посмотреть сообщение
char * - указатель на один символ или последовательность типа char.
Т.к. нужно получить символ, то
C++
1
2
char const * s = "c"; // внимание на кавычки - они двойные
int c = s[0]; // первый символ в строке
либо
C++
1
2
char s = 'c'; // один символ, кавычки одинарные
int c = s;
Про ковычки я знаю, боюсь что тут дело в адресации памяти.То есть переменная лишнюю информацию получает из памяти.Как с этим бороться не знаю
0
DrOffset
7320 / 4420 / 1001
Регистрация: 30.01.2014
Сообщений: 7,258
22.02.2014, 21:30 #8
Цитата Сообщение от reef213 Посмотреть сообщение
То есть переменная лишнюю информацию получает из памяти.Как с этим бороться не знаю
Что? Вы просто банально присвоили адрес s переменой типа int c.
Никакой лишней информации. Просто ваш код делает не то, что вы думаете.
Наверняка еще компилятор вам кучу warning`ов написал на ваш код.
0
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 21:40  [ТС] #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
0
DrOffset
7320 / 4420 / 1001
Регистрация: 30.01.2014
Сообщений: 7,258
22.02.2014, 21:51 #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);
пока не понятно какая конечная цель?
Вывести значения из файла как байт, три байта, четыре байт и два?
Или вывести побайтно все, что прочитано?
0
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 22:05  [ТС] #11
Вывести по байтно все что прочитано

Добавлено через 3 минуты
DrOffset, не помогло
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,930
22.02.2014, 22:08 #12
Цитата Сообщение от reef213 Посмотреть сообщение
Вывести по байтно все что прочитано
ну и в чем сложности?
вот так ты считываешь
Цитата Сообщение от reef213 Посмотреть сообщение
is.read (buffer,l);
а вот так выводишь
C++
1
2
for(int i=0;i<l;i++)
  printf("%x ",buffer[i]);
0
DrOffset
7320 / 4420 / 1001
Регистрация: 30.01.2014
Сообщений: 7,258
22.02.2014, 22:11 #13
Цитата Сообщение от reef213 Посмотреть сообщение
DrOffset, не помогло
Оно и не поможет, потому что это только одна ошибка
См. ответ ValeryS для дальнейших шагов.
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,930
22.02.2014, 22:20 #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";
1
reef213
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 26
22.02.2014, 22:21  [ТС] #15
DrOffset, с выводом все ясно как день, а что на счет того что бы представить массив символов HEX в dec виде? Поэтому у меня и стоит присвоение переменной типа unsigned int
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2014, 22:21
Привет! Вот еще темы с ответами:

Почему в IDE может не получится после компиляции исполняемый файл? - C Linux
В статье про установку CodeBlocks написано, что если при его установке поставить галку в строке MinGW то он (MinGW) установится сразу...

Получаю ошибки компиляции helloworld.c - undefined reference - RedHat, Fedora Linux
я новичок в линуксе. На практике задали установить библиотеку логгирования - log4c. На windows c ней возникли проблемы. т.к. turboC...

После компиляции dll в vc++ 2008 имя функции вот такое ?Add@MyMathFuncs@MathFuncs@@SAJJ@Z. Почему? - Visual C++
Я ожидал имя в dll Add@MyMathFuncs@MathFuncs Но не такое ?Add@MyMathFuncs@MathFuncs@@SAJJ@Z Вот код mydll.h и mydll.cpp: in...

Почему получаю ошибку - Java SE
Добрый день ! Почему в строке name = reader.readLine(); получаю ошибку ? import java.util.*; import java.lang.*; ...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
22.02.2014, 22:21
Ответ Создать тему
Опции темы

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