C99 N1256 стандартная черновик
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.5.3.4 Оператор sizeof :
3 При применении к операнду, который имеет структуру или тип объединения, результатом является общее количество байтов в таких объект, включая внутреннюю и конечную прокладку.
blockquote>6.7.2.1 Спецификаторы структуры и объединения :
13 ... Там может быть неназванным дополнением внутри объекта структуры, но не в начале.
blockquote>и:
15 В конце структуры может быть неназванное дополнение или объединение.
blockquote>Новая функция члена C99 с гибким элементом массива (
struct S {int is[];};
) также может влиять на заполнение:16 As в специальном случае последний элемент структуры с более чем одним именованным элементом может иметь неполный тип массива; это называется гибким элементом массива. В большинстве ситуаций гибкий элемент массива игнорируется. В частности, размер структуры выглядит так, как если бы гибкий элемент массива был пропущен, за исключением того, что он мог иметь более длинное дополнение, чем подразумевалось.
blockquote>Приложение J Проблемы с переносимостью повторяет:
Следующие неуказаны: ...
blockquote>
- Значение байтов заполнения при хранении значений в структурах или объединениях (6.2.6.1)
C ++ 11 Стандартная черновая версия N3337
http://www.open-std.org/jtc1/sc22/wg21/ docs / papers / 2012 / n3337.pdf
5.3.3 Размер :
2 При применении к классу результатом является количество байтов в объекте этого класса, включая любое дополнение, необходимое для размещения объектов этого типа в массиве.
blockquote>9.2 Члены класса :
Указатель на объект структуры стандартного макета, соответствующим образом преобразованный с использованием reinterpret_cast, указывает на его начальный член (или если этот элемент является битовым полем, то t o единица, в которой он находится) и наоборот. [Примечание. Таким образом, в рамках объекта структуры стандартного макета может быть указано неназванное заполнение, но не в его начале, по мере необходимости, для достижения соответствующего выравнивания. - end note]
blockquote>Я знаю достаточно C ++, чтобы понять примечание: -)
Бросок к интервалу является неявным усечением, не неявным настилом:
double d = -3.14;
int i = (int)d;
// i == -3
Я выбираю Math. Пол или Математика. Вокруг сделать мои намерения более явными.
Округление также обрабатывается по-другому:
x =-2.5 (интервала) x =-2 Преобразовывают. ToInt32(x) =-2
x =-1.5 (интервала) x =-1 Преобразовывают. ToInt32(x) =-2
x =-0.5 (интервала) x = 0 Преобразовывают. ToInt32(x) = 0
x = 0.5 (интервал) x = 0 Преобразовывает. ToInt32(x) = 0
x = 1.5 (интервал) x = 1 Преобразовывает. ToInt32(x) = 2
x = 2.5 (интервал) x = 2 Преобразовывает. ToInt32(x) = 2
Заметьте x =-1.5 и x=1.5 случаи.
В некоторых алгоритмах используемый метод округления очень важен для получения правильного ответа.
Преобразовать. ToInt32 () используется на строках (http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx), в то время как кастинг может только использоваться на типах, которые имеют внутренние преобразователи (числовые типы). Реальный прием прибывает в решение между Int32. Проанализируйте и Преобразуйте. ToInt32 (). Преобразовать. ToInt32 () терпим к пустому параметру и возвращается 0 в то время как Int32. Синтаксический анализ () бросит ArgumentNullException.
Можно использовать, Преобразовывают, когда у Вас есть строка, которую Вы хотите преобразовать в интервал
int i = Convert.ToInt32("1234");
Преобразуйте и кастинг оба выдаст исключение, если они перестанут работать.
т.е., это все еще выдаст исключение, оно не возвратится 0:
Convert.ToInt32("1234NonNumber");
Во многих случаях Преобразуйте, и кастинг будет иметь тот же результат, но бросок часто является временами, легче читать.