{ char* buf = calloc(n, sizeof(char)); // Ради чего я создал блок — ставлю в той же строке
snprintf(buf, n, some_shit);
strcpy(dest, buf);
free(buf);
}
{ std::ofstream os(fname);
os << someData;
} // Тут файл закрыт
__INT64_TYPE__
, который на данных настройках значит long long. Затем через жёсткую препроцессорную магию определяются и остальные типы и константы, связанные с int64.# include_next <stdint.h> // то есть самого себя!
. . .
#ifdef __INT64_TYPE__
# ifndef __int8_t_defined /* glibc sys/types.h also defines int64_t*/
typedef __INT64_TYPE__ int64_t;
# endif /* __int8_t_defined */
typedef __UINT64_TYPE__ uint64_t;
# undef __int_least64_t
# define __int_least64_t int64_t
# undef __uint_least64_t
# define __uint_least64_t uint64_t
# undef __int_least32_t
# define __int_least32_t int64_t
# undef __uint_least32_t
# define __uint_least32_t uint64_t
# undef __int_least16_t
# define __int_least16_t int64_t
# undef __uint_least16_t
# define __uint_least16_t uint64_t
# undef __int_least8_t
# define __int_least8_t int64_t
# undef __uint_least8_t
# define __uint_least8_t uint64_t
#endif /* __INT64_TYPE__ */
typedef long long int64_t;
struct OpaqueAddress;
using Address = OpaqueAddress*;
using Address = uint32_t;
enum class Address : uintptr_t { NUL = 0 };
prog += (double)1/(i*(i+1));
. Вычисляйте знаменатель в double, его длины более чем хватит.#if defined(__MINGW32__) && defined(__GNUC__) && !defined(__clang__)
#define MINGW_RANDOM_DEVICE_WORKAROUND
class MingwRandomDevice {}; // куча WinApi, опустим
#else //defined(__MINGW32__) && defined(__GNUC__) && !defined(__clang__)
#include <random>
using MingwRandomDevice = std::random_device;
#endif //defined(__MINGW32__) && defined(__GNUC__) && !defined(__clang__)
struct Arr1 {
int length;
int data[100];
}
struct Arr1 someFunc() {}
struct Arr2 {
int length;
int* data; // не забудь free(arr.data);
}
struct Arr2 someFunc() {}
int sprintf ( char * str, const char * format, ... );
char x = 'FIO';
char x[] = "FIO";
#include <iostream>
union DoubleInt {
double asDouble;
uint64_t asInt;
};
static_assert(sizeof(double) == sizeof(uint64_t), "Strange machine with double != int64");
constexpr int BITS_MANTISSA = 52;
constexpr int BITS_EXPONENT = 11;
constexpr int BITS_SIGN = 1;
static_assert(BITS_MANTISSA + BITS_EXPONENT + BITS_SIGN == 64, "Programmer's funkup");
constexpr uint64_t MANTISSA_UNIT = uint64_t(1) << BITS_MANTISSA;
constexpr uint64_t MANTISSA_MASK = MANTISSA_UNIT - 1;
constexpr int EXPONENT_SHIFT = BITS_MANTISSA;
constexpr uint64_t EXPONENT_MAX = (uint64_t(1) << BITS_EXPONENT) - 1;
constexpr uint64_t EXPONENT_ORIGIN = EXPONENT_MAX >> 1;
constexpr uint64_t EXPONENT_MASK = EXPONENT_MAX << EXPONENT_SHIFT;
constexpr uint64_t EXPONENT_SHIFTED_ORIGIN = EXPONENT_ORIGIN << EXPONENT_SHIFT;
constexpr int SIGN_SHIFT = BITS_MANTISSA + BITS_EXPONENT;
constexpr uint64_t SIGN_MASK = uint64_t(1) << SIGN_SHIFT;
int main()
{
DoubleInt x { -3.45 };
// Простите уж, без денормализованных чисел
// Оставим знак и мантиссу
DoubleInt xMantissa = x;
xMantissa.asInt &= (MANTISSA_MASK | SIGN_MASK);
// И добавим туда стандартный нулевой порядок
xMantissa.asInt |= EXPONENT_SHIFTED_ORIGIN;
// Извлечём порядок
int exponent = ((x.asInt & EXPONENT_MASK) >> EXPONENT_SHIFT) - EXPONENT_ORIGIN;
std::cout << xMantissa.asDouble << "*2^" << exponent << std::endl;
return 0;
}
#include <stdio.h>
int main()
{
int sz = sizeof('A'); // латинское
printf("sz = %d\n", sz);
return 0;
}
char test='A'
на стеке будет 1 байт (+выравнивание). Здесь Си, грубо говоря, проводит преобразование типа — прямо при компиляции. Если написать char test=L'Й'
, сообщит, что преобразование при компиляции ushort→char обрежет результат с 1049 до 25. не удается преобразовать 'char*' в 'int*' для аргумента '1' в 'int
недопустимое преобразование из 'int*' в 'int'
warning: narrowing conversion of '143' from 'int' to 'char' inside