我专门指的是这篇文章的这一部分
过大的移位量:将 uint32_t 移位 32 位或更多位是未定义的。我的猜测是,这是因为不同 CPU 上的底层移位操作对此做了不同的事情:例如,X86 将 32 位移位量截断为5 位(因此 32 位移位与 0 移位相同)位),但 PowerPC 将 32 位移位截断为6 位(因此移位 32 会产生零)。由于这些硬件差异,C 语言完全未定义该行为(因此在 PowerPC 上移位 32 位可能会格式化您的硬盘驱动器,但不能保证产生零)。消除这种未定义行为的代价是编译器必须为变量移位发出额外的操作(如“与”),这将使它们在普通 CPU 上的成本增加两倍。
那5位和6位是什么?
unsigned__int64 difference;
difference=(64*33554432);
printf ("size %I64u \n", difference);
difference=(63*33554432);
printf ("size %I64u \n", difference);
Run Code Online (Sandbox Code Playgroud)
第一个#非常大.第二个数字是正确的答案.如何将它从62改为63会导致这种变化?
第一个值是18446744071562067968第二个值是2113929216
对不起,值为64和63,而不是63和62.
要将32位无符号转换为有符号整数,可以使用:
function convert(n)
if n >= 2 ^ 31 then
return n - 2 ^ 32
end
return n
end
Run Code Online (Sandbox Code Playgroud)
没有这种比较,是否可以做到这一点?
PS:这是Lua,因此我不能像C一样"演员".
下面有两个循环.第一个效果很好,而第二个是无限循环.为什么?
for (unsigned int i=0; i<3; ++i)
{
std::cout << "i= " << i << std::endl; // this gives proper result
}
for (unsigned int i=3; i>=0; --i)
{
std::cout << "i= " << i << std::endl; // infinite loop
}
Run Code Online (Sandbox Code Playgroud) 我不擅长C语言,只是遇到了一个我不明白的问题.代码是:
int main()
{
unsigned int a = 100;
unsigned int b = 200;
float c = 2;
int result_i;
unsigned int result_u;
float result_f;
result_i = (a - b)*2;
result_u = (a - b);
result_f = (a-b)*c;
printf("%d\n", result_i);
printf("%d\n", result_u);
printf("%f\n", result_f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
-200
-100
8589934592.000000
Program ended with exit code: 0
Run Code Online (Sandbox Code Playgroud)
因为(ab)是负的,而a,b是无符号的int类型,(ab)是微不足道的.乘以浮点类型数c后,结果为8589934592.000000.我有两个问题:
首先,为什么在将int类型数字2相乘并分配给int类型数字后,结果是非平凡的?
第二,为什么result_u是非平凡的,即使(ab)是负数,而result_u是无符号的int类型?
我使用Xcode测试此代码,编译器是默认的APPLE LLVM 6.0.
谢谢!
假设我必须接受一个大小作为处理数组的接口的参数.对于前者
void doSomethingRelatedToArrays(const size_t length)
Run Code Online (Sandbox Code Playgroud)
在这里,我使用size_t时考虑到以下因素:
但是,我不应该在我的接口中使用无符号类型,因为客户端可以传入负数,这是隐式转换为无符号数,我没有办法在我的方法中验证它.请参阅斯科特·迈尔的文章就这个问题在这里.
所以,我应该将有符号整数类型传递给API.但是如何在系统中获得最大的有符号整数类型?是否有任何类似于size_t的typedef被签名?或者我应该只使用size_t?
我有一个RNG功能xorshift128plus,需要一个Xorshift128PlusKey:
/**
* \brief Keys for scalar xorshift128. Must be non-zero.
* These are modified by xorshift128plus.
*/
struct Xorshift128PlusKey
{
uint64_t s1;
uint64_t s2;
};
/**
* \brief Return a new 64-bit random number.
*/
uint64_t xorshift128plus(Xorshift128PlusKey* key);
Run Code Online (Sandbox Code Playgroud)
我想使用rdtsc(处理器时间戳)为我的RNG 播种.问题是__rdtscmsvc下的内在函数返回64位无符号整数,种子必须是32位无符号整数.什么是对RDTSC转换为种子的最佳方式,同时保留随机性.转换必须尽可能快.
我不能使用std lib或boost.(这是一个游戏引擎)
我有一个包含负数的int64变量,我希望从包含一个正数的uint64变量中减去它:
var endTime uint64
now := time.Now().Unix()
endTime = uint64(now)
var interval int64
interval = -3600
endTime = endTime + uint64(interval)
Run Code Online (Sandbox Code Playgroud)
上面的代码似乎有效,但是我想知道是否可以依靠它。对于Go语言的新手,我感到很惊讶,在将负数强制转换为uint64后仍保持负数-我计划减去(正数后)正值(强制转换后)以获得所需的值。
问题是当我执行“ for(int i = 0; i <vector.size()-1; i ++)”时,它给我一个“向量下标超出范围”的错误。但是,如果我将vector.size()-1放入变量中,它将起作用。这是小故障还是我只是想念一些东西?
这有效:
int sizePos = positionsX.size() - 1;
for (int i = 0; i < sizePos; i++) {
if (snake.getX() == positionsX[i] && snake.getY() == positionsY[i]) {
gameOver = true;
std::cout << as << std::endl;
as++;
}
if (apple.getX() == positionsX[i] && apple.getY() == positionsY[i]) {
apple.eat();
}
}
Run Code Online (Sandbox Code Playgroud)
并且这不会:
for (int i = 0; i < positionsX.size() - 1; i++) {
if (snake.getX() == positionsX[i] && snake.getY() == positionsY[i]) {
gameOver …Run Code Online (Sandbox Code Playgroud) 这段代码给出了有意义的输出
#include <iostream>
int main() {
unsigned int ui = 100;
unsigned int negative_ui = -22u;
std::cout << ui + negative_ui << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
78
Run Code Online (Sandbox Code Playgroud)
变量negative_ui存储-22,但是是一个unsigned int。我的问题是为什么unsigned int negative_ui = -22u;有效。unsigned int商店如何存储负数?是否节省使用或产生不确定的行为?
我使用的是Intel编译器18.0.3。使用该选项时,-Wall不会发生警告。
附言 我已经读过,如果我给一个无符号变量赋一个负值会怎样?以及为什么unsigned int包含负数