关于已签名和未签名的键值,我已经看到了一些关于每个人现在正在做什么的线索.似乎无符号是最佳的,因为它允许相同成本的两倍数量的行.签名密钥有什么好处吗?
有没有标准的共识?似乎签名是答案,因为"它一直是这样"
我刚看到一些像这样的C++代码.它正在使用一个条件来决定是向前还是向后走std::vector.编译器没有抱怨,但我认为size_t是无符号的.这有危险吗?
vector<int> v { 1,2,3,4,5 };
bool rev = true;
size_t start, end, di;
if (rev) {
start = v.size()-1;
end = -1;
di = -1;
}
else {
start = 0;
end = v.size();
di = 1;
}
for (auto i=start; i!=end; i+=di) {
cout << v[i] << endl;
}
Run Code Online (Sandbox Code Playgroud) 我在这个网站上搜索了一个答案,发现许多对未签名/签名比较的回复,但是这个问题是只比较了无符号参数,但它仍然很有趣.
以下代码的问题在于第一个if-statment不会发生("hello"),而第二个("world")就是这样.我已经解释为在if-statment 内部进行的计算会生成一个负数但是保存到变量的结果完全相同的计算不会(即使结果被保存到有符号变量).
使用的编译器是gcc 4.4.
unsigned short u16_varHigh;
unsigned short u16_varLow;
unsigned short u16_Res1;
signed short s16_Res1;
u16_varHigh = 0xFFFF;
u16_varLow = 10;
u16_Res1 = u16_varLow - u16_varHigh; // response is 11 as expected
s16_Res1 = u16_varLow - u16_varHigh; // response is 11 as expected
// Does not enter
if( (u16_varLow - u16_varHigh) > (unsigned short)5 )
{
printf( "hello" );
}
// Does enter
if( (unsigned short)(u16_varLow - u16_varHigh) > 5 )
{
printf( "world" …Run Code Online (Sandbox Code Playgroud) 我有位移和无符号长的问题.这是我的测试代码:
char header[4];
header[0] = 0x80;
header[1] = 0x00;
header[2] = 0x00;
header[3] = 0x00;
unsigned long l1 = 0x80000000UL;
unsigned long l2 = ((unsigned long) header[0] << 24) + ((unsigned long) header[1] << 16) + ((unsigned long) header[2] << 8) + (unsigned long) header[3];
cout << l1 << endl;
cout << l2 << endl;
Run Code Online (Sandbox Code Playgroud)
我希望l2也有2147483648的值,但它打印18446744071562067968.我假设第一个字节的位移会导致问题?
希望有人可以解释为什么这会失败以及我如何修改l2的计算以便它返回正确的值.
提前致谢.
通常我使用的对象将具有(签名的)int参数(例如int iSize),这些参数最终存储了应该有多大的东西.同时,我经常将它们初始化-1为表示对象(等)尚未设置/尚未填充/尚未准备好使用.
comparison between signed and unsigned integer当我做类似的事情时,我常常会收到警告if( iSize >= someVector.size() ) { ... }.
因此,我名义上不想使用unsigned int.是否存在导致错误或意外行为的情况?
如果不是:处理这个问题的最佳方法是什么?如果我使用编译器标志,-Wno-sign-compare我可以(假设)错过我应该使用unsigned int(或类似的东西)的情况.那么在与unsigned int--eg 比较时我应该使用一个演员if( iSize >= (int)someVector.size() ) { ... }吗?
C和C++是否保证类型的无符号等价物具有相同的大小?
例:
size_t size = sizeof(unsigned int);
Run Code Online (Sandbox Code Playgroud)
在unsigned这里完全实际意义?
我编译了以下程序:
#include <stdint.h>
uint64_t usquare(uint32_t x) {
return (uint64_t)x * (uint64_t)x;
}
Run Code Online (Sandbox Code Playgroud)
这拆解为:
0: 89 f8 mov eax,edi
2: 48 0f af c0 imul rax,rax
6: c3 ret
Run Code Online (Sandbox Code Playgroud)
但是imul用于乘以有符号数字的指令.那为什么用gcc呢?
/ edit:使用uint64_t程序集时类似:
0: 48 0f af ff imul rdi,rdi
4: 48 89 f8 mov rax,rdi
7: c3 ret
Run Code Online (Sandbox Code Playgroud) 我在Nutshell中读C并发现:
"如果定义了可选的带符号类型(没有前缀u),则需要相应的无符号类型(带有初始u),反之亦然."
该段落是关于具有精确宽度(C99)的整数类型.
我认为unsigned int只能存储整数> = 0.但是我尝试将一个负数赋给unsigned int,没有什么特别的事情发生.它似乎存储了没有问题的值.
那么signed和unsigned int之间有什么区别,如果它可以存储任何值,那又有什么意义呢?
unsigned ×10
c ×5
c++ ×4
signed ×4
comparison ×2
int ×2
assembly ×1
c++11 ×1
c99 ×1
if-statement ×1
integer ×1
long-integer ×1
mysql ×1
primary-key ×1
size-t ×1
sizeof ×1
stdint ×1
warnings ×1
x86 ×1
x86-64 ×1