crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Что не так с типами данных
vankleef
  опции профиля:
сообщение 4.6.2011, 23:35
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 21.10.2010
Пользователь №: 2134

Спасибо сказали: 9 раз(а)




Репутация:   1  


есть вот такой код
int l=10000000;
cout<<l+1;

компилится все отлично, без ошибок.
но ведь значение int'a в 10000000 превосходит его предел как в знаковом, так и в беззнаковом варианте.
так вот почему это работает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alex977
  опции профиля:
сообщение 5.6.2011, 0:08
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 310
Регистрация: 19.6.2008
Из: Россия, МО, г.Мытищи
Пользователь №: 206

Спасибо сказали: 77 раз(а)




Репутация:   8  


Возможно поможет - максимальное число для типа int
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 5.6.2011, 1:42
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


да, alex977, правильно указал на получение максимального int'а. на самом деле, битность зависит и от системы, и от компилятора. 2 байта - это гарантия ДЛЯ ВСЕХ компиляторов, в том числе для чистого С. это важно для совместимости кода разных компиляторов и при передаче данных. но это не означает, что данный конкретный компилятор будет юзать для типа int два байта. вообще, давно есть типы int16, int32, int64 (названия могут варьироваться слегка от компилятора к компилятору, но суть понятна). если нужна конкретика - юзай более точные типы данных.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 5.6.2011, 6:19
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(vankleef @ 5.6.2011, 5:35) *
есть вот такой код
int l=10000000;
cout<<l+1;

компилится все отлично, без ошибок.
но ведь значение int'a в 10000000 превосходит его предел как в знаковом, так и в беззнаковом варианте.
так вот почему это работает?

даже если система 64-разрядная ? Инт от разряда системы зависит и не только. Поэтому в Сях и болтаются определения MAX_INT, MAXINT или INT_MAX. Покопайтесь в хедерах, много интересного
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.6.2011, 6:36
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Если INT 4-х байтный и знаковый, то максимум = 2 147 483 647, а у тебя всего 10 000 000
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vankleef
  опции профиля:
сообщение 5.6.2011, 9:55
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 21.10.2010
Пользователь №: 2134

Спасибо сказали: 9 раз(а)




Репутация:   1  


Цитата(Litkevich Yuriy @ 5.6.2011, 7:36) *
Если INT 4-х байтный и знаковый, то максимум = 2 147 483 647, а у тебя всего 10 000 000


так вроде long 4-х байтный..)
а так спасибо всем за ответы. интересно читать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.6.2011, 10:05
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(vankleef @ 5.6.2011, 12:55) *
так вроде long 4-х байтный..)

short = 2 байта
int = short или long (зависит от реализации компилятора/платформы)
long = 4 байта
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 5.6.2011, 10:17
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Не забывайте про 64-битные платформы. :)
Цитата
$ cat a.cpp
#include <iostream>

int main( int, char ** )
{
std::cout << "sizeof char = " << sizeof( char ) << std::endl;
std::cout << "sizeof short = " << sizeof( short ) << std::endl;
std::cout << "sizeof int = " << sizeof( int ) << std::endl;
std::cout << "sizeof long = " << sizeof( long ) << std::endl;

return 0;
}
$ g++ a.cpp
$ ./a.out
sizeof char = 1
sizeof short = 2
sizeof int = 4
sizeof long = 8
$ g++ -v
Используются внутренние спецификации.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/lto-wrapper
Целевая архитектура: x86_64-unknown-linux-gnu
Параметры конфигурации: /build/src/gcc-4.6-20110513/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --enable-gnu-unique-object --enable-linker-build-id --with-ppl --enable-cloog-backend=isl --enable-lto --enable-gold --enable-ld=default --enable-plugin --with-plugin-ld=ld.gold --disable-multilib --disable-libstdcxx-pch --enable-checking=release
Модель многопоточности: posix
gcc версия 4.6.0 20110513 (prerelease) (GCC)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 15:51