可能重复:
实际使用零长度位域
为什么有些结构具有零宽度位域,为什么需要它?
struct foo {
int a:3;
int b:2;
int :0; // Force alignment to next boundary.
int c:4;
int d:3;
};
int main()
{
int i = 0xFFFF;
struct foo *f = (struct foo *)&i;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", f->a, f->b, f->c, f->d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上述程序的输出是
manav@os-team:~/programs/test$ ./a.out
a=-1
b=-1
c=-8
d=0
Run Code Online (Sandbox Code Playgroud)
请解释为什么这些值是负数,以及结构内部这些变量的内存布局?
ISO C标准允许三种编码方法用于有符号整数:二进制补码,一个补码和符号/幅度.
在运行时检测编码的有效或好方法是什么(或者如果有更好的解决方案,还有其他时间)?我想知道这一点,所以我可以针对不同的可能性优化bignum库.
我计划计算这个,并在每次程序运行时将其存储在一个变量中,所以它不必非常快 - 我假设在程序运行期间编码不会改变:-)
Go的内置len()函数返回一个签名int.为什么不是uint用来代替?
是否有可能len()返回负面的东西?
据我所知,答案是否定的:
我是VHDL的新手,我很难搞清楚哪些数据类型适合在哪里使用.如果我理解正确,对于综合,所有顶级实体端口都应该声明为std_logic_vector或std_logic,而不是任何其他类型.
但是std_logic_vector不支持算术,所以我应该如何处理呢?
我的直觉告诉我,我应该在顶层使用std_logic_vector,然后在将其传递给其他实体时将其转换为整数数据类型.它是否正确?
什么积分数据类型(整数,无符号,有符号)应该在哪里使用?我理解有符号和无符号之间的区别,但什么时候应该使用整数?
我正在尝试在bitfloor.com上向交易API发出签名请求(这是一个REST API)
Bitfloor给了我:
1)API密钥(即6bd2b780-00be-11e2-bde3-2837371c3c3a)
2)密钥(即oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA ==)
以下是Bitfloor提出请求的确切说明:
请求必须是端口443(https)上的HTTPS POST请求.每个请求必须包含所需的标头(如下所列).标头识别,验证和验证您的请求以防止篡改.头
bitfloor-key这是由bitfloor提供的唯一标识您的帐户.(即6bd2b780-00be-11e2-bde3-2837371c3c3a)
bitfloor-sign符号字段是请求正文的sha512-hmac,使用与您的api密钥对应的密钥.
要签署您的请求: base64将密钥解码为原始字节(64字节).将这些字节用于http请求正文的sha512-hmac签名.Base64对签名结果进行编码并发送到此标头字段.
bitfloor-passphrase创建此api密钥时指定的密码.如果忘记,我们无法恢复您的密码.您需要创建一个新的API密钥.
bitfloor-version您感兴趣的资源的api版本.当前唯一有效的值是1
经过整整八个小时的反复试验并反复搜索互联网以获取任何洞察力或信息,以下代码尽可能接近我认为可能在如何正确构建请求的方向,唉,无论我接受什么,我的API都会返回"无效签名".
这是我到目前为止所拥有的......
首先,我在网上找到了这个函数,有人写信给SHA512签名:
<cffunction name="HMAC_SHA512" returntype="binary" access="public" output="false">
<cfargument name="signKey" type="string" required="true">
<cfargument name="signMessage" type="string" required="true">
<cfset var jMsg = JavaCast("string",arguments.signMessage).getBytes("iso-8859-1")>
<cfset var jKey = JavaCast("string",arguments.signKey).getBytes("iso-8859-1")>
<cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec")>
<cfset var mac = createObject("java","javax.crypto.Mac")>
<cfset key = key.init(jKey,"HmacSHA512")>
<cfset mac = mac.getInstance(key.getAlgorithm())>
<cfset mac.init(key)>
<cfset mac.update(jMsg)>
<cfreturn mac.doFinal()>
</cffunction>
Run Code Online (Sandbox Code Playgroud)
我不知道它做了什么,但它似乎工作,没有错误.
这是我对此函数的实现以及我尝试发出请求:注意:"nonce"值是必须与请求一起发送的参数.
<cffunction name="myorders">
<cfset nonce = dateDiff("s",createDateTime(2012,01,01,0,0,0),now())>
<cfset requestbody …Run Code Online (Sandbox Code Playgroud) 在C ++中,存在一个别名漏洞,该漏洞允许通过某些字符类型的指针来读取或写入任何对象的对象表示。
这仅适用于char和unsigned char还是适用于signed char?
在(char)0xff的左移8,并将其转换为int,我们得到-256或0xffffff00.有人可以解释为什么会这样吗?
#include <stdio.h>
int main (void)
{
char c = 0xff;
printf("%d %x\n", (int)(c<<8),(int)(c<<8));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
-256 ffffff00
Run Code Online (Sandbox Code Playgroud) 当我比较一个std::abs(int)和一个时,我正在收到有关签名与无签名比较的警告unsigned.事实上,std::abs返回签署的值.为什么选择这个?它将解决负值的问题,其绝对值不能用有符号的类型表示.
然后,是否有比这更清洁(即没有演员表)的东西以避免警告?
#include <cassert>
#include <cstdlib>
// max(1, lhs + rhs). (lhs must be > 0)
unsigned add(unsigned lhs, int rhs)
{
return
(0 < rhs || static_cast<unsigned>(-rhs) < lhs
? rhs + lhs
: 1);
}
int main()
{
assert(add(42, -41) == 1);
assert(add(42, 0) == 43);
assert(add(42, 1) == 43);
assert(add(42, -51) == 1);
}
Run Code Online (Sandbox Code Playgroud) 当我在工作时,string::npos我注意到了一些东西,我在网上找不到任何解释.
(string::npos == ULONG_MAX)
Run Code Online (Sandbox Code Playgroud)
和
(string::npos == -1)
Run Code Online (Sandbox Code Playgroud)
是真的.
所以我尝试了这个:
(18446744073709551615 == -1)
Run Code Online (Sandbox Code Playgroud)
这也是事实.
怎么可能?是因为二元对话吗?
采取以下代码
#include <iostream>
void func() {
int i = 2147483640;
while (i < i + 1)
{
std::cerr << i << '\n';
++i;
}
return;
}
int main() {
func();
}
Run Code Online (Sandbox Code Playgroud)
这段代码显然是错误的,因为while循环仅在有符号的int i溢出(即UB)时才能终止,因此编译器可以例如将其优化为无限循环(Clang在上进行-O3)或执行其他类型的时髦操作。现在我的问题是:从我对C ++标准的阅读中,等同于签名的类型可能会别名(即指针int*和unsigned*别名)。为了进行一些时髦的签名“包装”,以下内容是否具有未定义的行为?
#include <iostream>
static int safe_inc(int a)
{
++reinterpret_cast<unsigned&>(a);
return a;
}
void func() {
int i = 2147483640;
while (i < safe_inc(i))
{
std::cerr << i << '\n';
++i;
}
return;
}
int main() {
func(); …Run Code Online (Sandbox Code Playgroud)