Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么';移位32位变量32位有什么不好?_C_Bit Manipulation_32bit 64bit - Fatal编程技术网

C 什么';移位32位变量32位有什么不好?

C 什么';移位32位变量32位有什么不好?,c,bit-manipulation,32bit-64bit,C,Bit Manipulation,32bit 64bit,我最近收到了布鲁斯·施奈尔(Bruce Schneier)的《应用密码学》(Applied Cryptography)一书,读起来很不错。我现在了解了书中概述的几种算法是如何工作的,我想开始用C语言实现其中的一些算法 许多算法的一个共同点是将一个x位密钥划分为几个较小的y位密钥。例如,Blowfish的密钥X是64位的,但需要将其分成两个32位的一半;Xl和Xr 这就是我被卡住的地方。我对C相当在行,但对于位运算符之类的东西,我不是最强的 在IRC上得到一些帮助后,我终于想出了以下两个宏: #d

我最近收到了布鲁斯·施奈尔(Bruce Schneier)的《应用密码学》(Applied Cryptography)一书,读起来很不错。我现在了解了书中概述的几种算法是如何工作的,我想开始用C语言实现其中的一些算法

许多算法的一个共同点是将一个x位密钥划分为几个较小的y位密钥。例如,Blowfish的密钥X是64位的,但需要将其分成两个32位的一半;Xl和Xr

这就是我被卡住的地方。我对C相当在行,但对于位运算符之类的东西,我不是最强的

在IRC上得到一些帮助后,我终于想出了以下两个宏:

#define splitup(a, b, c) {b = a >> 32; c = a & 0xffffffff; }
#define combine(a, b, c) {a = (c << 32) | a;}
#定义拆分(a,b,c){b=a>>32;c=a&0xffffffff;}
#定义组合(a,b,c){a=(c
移位32位变量32位有什么坏处

0
赋值给n位整数比将其移位n位要好

例如:


我仍然没有一种方法将两个32位变量组合成一个64位变量

考虑:
a
是64位,
b
c
是32位

a = b;
a = a << 32; //Note: a is 64 bit
a = a | c;
a=b;
a=a
移位32位变量32位有什么坏处

0
赋值给n位整数比将其移位n位要好

例如:


我仍然没有一种方法将两个32位变量组合成一个64位变量

考虑:
a
是64位,
b
c
是32位

a = b;
a = a << 32; //Note: a is 64 bit
a = a | c;
a=b;
a=a除非这是一个“重新发明轮子以了解其工作原理”的项目,否则不要实现自己的加密功能

永远

使用可用的算法来工作(并选择正确的算法)已经够难的了,不要在生产中投入一些自主开发的加密API来打击自己。机会是

除非这是一个“重新发明轮子以了解其工作原理”的项目,否则不要实现自己的加密功能

永远


使用可用的算法工作(并选择正确的算法)已经够难的了,不要在生产中使用一些国产的cryptor API来打击自己。很可能是这样的,这是未定义的行为

ISO/IEC 9899:1999 6.5.7按位移位运算符

对每个操作数执行整数提升。结果的类型为提升后的左操作数的类型。如果右操作数的值为负数或大于或等于提升后的左操作数的宽度,则行为未定义

C11又名ISO/IEC 9899:2011也有同样的说法

您应该首先将
b
强制转换为目标整数类型。另一点是,您应该在宏参数周围加上括号,以避免运算符前导出现意外情况。此外,逗号运算符在这里非常有用,它允许您避免大括号,以便宏可以用作普通命令,并用半圆号关闭开

#define splitup(a,b,c) ( (b) = (a) >> 32, (c) = (a) & 0xffffffff )
#define combine(a,b,c) ( (a) = ((unsigned long long)(b) << 32) | (c) )

而且请不要考虑对生产代码使用您自己编写的加密。

是的,这是未定义的行为

ISO/IEC 9899:1999 6.5.7按位移位运算符

对每个操作数执行整数提升。结果的类型为提升后的左操作数的类型。如果右操作数的值为负数或大于或等于提升后的左操作数的宽度,则行为未定义

C11又名ISO/IEC 9899:2011也有同样的说法

您应该首先将
b
强制转换为目标整数类型。另一点是,您应该在宏参数周围加上括号,以避免运算符前导出现意外情况。此外,逗号运算符在这里非常有用,它允许您避免大括号,以便宏可以用作普通命令,并用半圆号关闭开

#define splitup(a,b,c) ( (b) = (a) >> 32, (c) = (a) & 0xffffffff )
#define combine(a,b,c) ( (a) = ((unsigned long long)(b) << 32) | (c) )

和请不要考虑使用自己编写的加密来产生代码。< /P> < P>在C和C++中未定义32位的32位或更多的移位。其中一个原因是未定义的,在某些硬件平台上,32位移位指令只考虑所提供的移位计数的5个最低位。不管你传递的移位计数是多少,它都会被解释为模32。在这样的平台上尝试移位32实际上会移位0,也就是说,根本不会移位


语言作者不想让为此类平台编写的编译器承担在执行移位之前分析移位计数的任务。相反,语言规范指出行为未定义。这意味着如果您希望从32位移位32(或更多)中获得0值在C和C++中,32位值的32位或更多的移位是不确定的。其中一个原因是,在某些硬件平台上,32位移位指令只考虑了提供的移位计数的5个最低位。如果您通过ft count,它将被解释为模32。在这样的平台上尝试移位32实际上会移位0,即根本不会移位

语言作者不想让为此类平台编写的编译器承担在执行移位之前分析移位计数的任务。相反,语言规范指出行为未定义。这意味着如果您希望从32位移位32(或更多)中获得0值,这取决于您认识到情况并相应地进行处理

移位32位变量32位有什么坏处

除了已经说过的,第32位是符号位,您可能会得到符号扩展以保留sing,从而丢失有效位

移位32位变量32位有什么坏处

除了已经说过的,第32次