在我的计算中,函数 rand(); 在C语言中输出一个32位数字。
下面的代码会生成一个随机的 uint_8 数吗?或者它可以依赖于平台?
uint8_t var=(uint8_t) rand();
Run Code Online (Sandbox Code Playgroud)
由于计算模数的时间复杂度,我不想使用模运算。
这段代码确实会将 的返回值转换rand为 类型的值uint8_t。该转换实际上是通过截断除最低 8 位之外的所有位来进行的。
就使用模运算符而言,大多数编译器都足够聪明,可以将模2 n转换为按位 AND 并使用设置了n 个低位的值。
请注意,对于简单用途来说,这很好,但是如果您想生成适合加密目的的随机数,或者如果您想确保更好的随机分布,则应该使用加密库(例如 OpenSSL)而不是该函数rand。
由于计算模数的时间复杂度,我不想使用模运算。
现代编译器足够聪明,当不是绝对必要时不会使用除法。
以下所有内容都会产生相同的生成代码:
uint8_t foo(void)
{
return rand();
}
uint8_t foo1(void)
{
return (uint8_t)rand();
}
uint8_t foo2(void)
{
return rand() % 0x100;
}
uint8_t foo3(void)
{
return rand() & 0xff;
}
Run Code Online (Sandbox Code Playgroud)
以及生成的代码:
foo():
sub rsp, 8
call rand
add rsp, 8
ret
foo1():
sub rsp, 8
call rand
add rsp, 8
ret
foo2():
sub rsp, 8
call rand
add rsp, 8
ret
foo3():
sub rsp, 8
call rand
add rsp, 8
ret
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
409 次 |
| 最近记录: |