关于以MySQL的TIMESTAMP格式保存日期和时间值与自定义UNSIGNED INT格式相比,我处于两难境地.这里主要考虑的是检索速度,PHP中适当的范围计算以及偶尔格式化为人类可读取的值.
每种类型所需的存储空间及其范围:
DATETIME 8 bytes '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
TIMESTAMP 4 bytes '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC
UNSIGNED INT 4 bytes (Maximum Value 4294967295)
Run Code Online (Sandbox Code Playgroud)
我根本不需要DATETIME的范围.我在TIMESTAMP和UNSIGNED INT之间徘徊.
有利于UNSIGNED INT的论据:
TIMESTAMP给我的唯一好处是当我手动读取mysql表中的值并需要"看到"它们时.
是否有任何令人信服的理由使用TIMESTAMP而不是UNSIGNED INT?
这是这个问题的后续行动.
(为什么/何时)是否更适合Py_ssize_t用于索引?在我刚发现的文档中
Run Code Online (Sandbox Code Playgroud)# Purists could use "Py_ssize_t" which is the proper Python type for # array indices.
- >这是否始终指的是索引NumPy/Cython - 数组/ - 应该使用的视图Py_ssize_t?
- >是Py_ssize_t例如一个unsigned int,这样我可以不使用@cython.boundscheck(False)
我试过了:
#include <vector>
int main () {
std::vector<int> v;
int size = v.size;
}
Run Code Online (Sandbox Code Playgroud)
但得到了错误:
cannot convert 'std::vector<int>::size' from type 'std::vector<int>::size_type (std::vector<int>::)() const noexcept' {aka 'long unsigned int (std::vector<int>::)() const noexcept'} to type 'int'
Run Code Online (Sandbox Code Playgroud)
将表达式转换为int如下:
#include <vector>
int main () {
std::vector<int> v;
int size = (int)v.size;
}
Run Code Online (Sandbox Code Playgroud)
也会产生错误:
error: invalid use of member function 'std::vector<_Tp, _Alloc>::size_type std::vector<_Tp, _Alloc>::size() const [with _Tp = int; _Alloc = std::allocator<int>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]' (did you forget the '()' …Run Code Online (Sandbox Code Playgroud) 考虑这些定义:
int x=5;
int y=-5;
unsigned int z=5;
Run Code Online (Sandbox Code Playgroud)
它们如何存储在内存中?任何人都能解释这些在内存中的位表示吗?
能int x=5和int y=-5有相同的内存位表示?
我正在阅读标准并试图弄清楚为什么没有演员表就无法解决此代码.
void foo(char c) { }
// Way bigger than char
void foo(unsigned long int) { }
int main()
{
foo(123456789); // ambiguous
foo((unsigned long int) 123456789); // works
}
Run Code Online (Sandbox Code Playgroud)
这就是它所说的:
4.13整数转换排名[conv.rank]
每个整数类型都有一个整数转换等级,定义如下:
- 任何无符号整数类型的等级应等于相应有符号整数类型的等级.
- char的等级应等于signed char和unsigned char的等级.
特别是,我的jimmies的沙沙声是它没有说任何无符号整数类型,只是unsigned char.我的猜测是,char通过转换被提升为无符号类型.这是真的?
c++ integer integer-promotion implicit-conversion unsigned-integer
假设你有这个:
struct Foo {
Foo(unsigned int x) : x(x) {}
unsigned int x;
};
int main() {
Foo f = Foo(-1); // how to get a compiler error here?
std::cout << f.x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
是否有可能阻止隐式转换?
我能想到的唯一方法是explicilty提供一个构造函数,int如果int是负数,则会产生并产生某种运行时错误,但如果我为此得到编译器错误会更好.
我几乎可以肯定,有一个重复,但我能找到的最接近的是这个问题,而不是为什么允许隐式转换.
我对C++ 11和pre C++ 11解决方案感兴趣,最好是两者兼容.
我有一个关于Delphi中位移行为的问题(或者更可能是错误报告)(在Borland Delphi 7中测试过).
目标:使用任意数字向右执行"算术"按位移位.
这意味着必须扩展符号位 - 如果设置了一个数字的最高有效位,则将从左侧填充二进制数,而不是0.
因此,算术右移后的数字"-1"必须保持相同的数字(所有位= 1),但是"逻辑移位"(总是用零填充数字)必须给出最大正整数(最大正有符号整数) ,为了正确)
我只在32位系统上测试过它(Windows); 而且,我需要它以32位整数显式工作.
当源编号存储在变量中时,看起来Delphi中存在带有"shr"的内部错误.
我的示例代码:
program bug;
{$APPTYPE CONSOLE}
var
I:Integer;
C:Cardinal;
begin
I := -1; // we’ll need that later
C := $FFFFFFFF;
Run Code Online (Sandbox Code Playgroud)
(这只是开始).接下来,让我们尝试一些"shr":
Writeln('0) ', -1 shr 1 );
Writeln('1) ', $FFFFFFFF shr 1 );
Run Code Online (Sandbox Code Playgroud)
"-1"是等效于"$ FFFFFFFF"的签名.似乎"shr"行为(算术或逻辑)基于源号是签名还是不签名(整数或基数)的事实.
输出是:
0) -1
1) 2147483647
Run Code Online (Sandbox Code Playgroud)
非常正确.然后我需要尝试手动将这些数字转换为整数或基数:
Writeln('2) ', Integer(-1) shr 1 );
Writeln('3) ', Integer($FFFFFFFF) shr 1 );
Writeln('4) ', Cardinal(-1) shr 1 );
Writeln('5) ', Cardinal($FFFFFFFF) shr 1 ); …Run Code Online (Sandbox Code Playgroud) 考虑以下†:
size_t r = 0;
r--;
const bool result = (r == -1);
Run Code Online (Sandbox Code Playgroud)
结果初始化的比较是否result具有明确定义的行为?正如我所期待的那样,
结果true如何?
这个Q&A的写作是因为我不确定有两个因素.
在我的回答中,它们都可以通过使用术语"关键[ly]"来识别.
†此示例的灵感来自于计数器未签名时的循环条件方法:
for (size_t r = m.size() - 1; r != -1; r--)
在 Jens Gustedt 的《Modern C》一书中,第 59 页,他解释了如何使用无符号整数来模拟有符号整数。他的示例代码展示了如何实现将两个无符号整数重新解释为有符号整数的比较:
bool is_negative(unsigned a) {
unsigned const int_max = UINT_MAX /2;
return a > int_max;
}
bool is_signed_less(unsigned a, unsigned b) {
if (is_negative(b) && !is_negative(a)) return false;
else return a < b;
}
Run Code Online (Sandbox Code Playgroud)
我是否误解了这里的某些内容,或者他是否错过了第二个特殊情况 whereis_negative(a) = true和is_negative(b) = false?
例如,如果我们想要a = -1和b = 1,那么,使用补码,我们可以将它们表示为
unsigned int a = UINT_MAX;
unsigned int b = 1;
Run Code Online (Sandbox Code Playgroud)
(例如,对于 4 位整数,我们将有 a = 1111 和 b = 0001)。现在我们有is_negative(a) …
在被建议阅读"Stanley B. Lipman编着的C++ Primer 5"后,我不明白这一点:
第66页."涉及无符号类型的表达式"
unsigned u = 10;
int i = -42;
std::cout << i + i << std::endl; // prints -84
std::cout << u + i << std::endl; // if 32-bit ints, prints 4294967264
Run Code Online (Sandbox Code Playgroud)
他说:
在第二个表达式中,int值-42在添加完成之前转换为unsigned.将负数转换为无符号的行为就像我们尝试将该负值分配给无符号对象一样.如上所述,值"环绕".
但如果我做这样的事情:
unsigned u = 42;
int i = -10;
std::cout << u + i << std::endl; // Why the result is 32?
Run Code Online (Sandbox Code Playgroud)
如您所见-10,未转换为unsigned int.这是否意味着一个比较提倡之前发生signed integer到unsigned integer?