import socket
import os
import struct
import sys
from ctypes import *
# host to listen on
host = sys.argv[1]
class IP(Structure):
_fields_ = [
("ihl", c_ubyte, 4),
("version", c_ubyte, 4),
("tos", c_ubyte),
("len", c_ushort),
("id", c_ushort),
("offset", c_ushort),
("ttl", c_ubyte),
("protocol_num", c_ubyte),
("sum", c_ushort),
("src", c_ulong),
("dst", c_ulong)
]
def __new__(self, socket_buffer=None):
return self.from_buffer_copy(socket_buffer)
def __init__(self, socket_buffer=None):
# map protocol constants to their names
self.protocol_map = {1:"ICMP", 6:"TCP", 17:"UDP"}
# human readable IP addresses
self.src_address = socket.inet_ntoa(struct.pack("<L",self.src))
self.dst_address = …Run Code Online (Sandbox Code Playgroud) 在GLib文档中,有一章关于类型转换宏.在关于转换int为*void指针的讨论中,它说(强调我的):
天真的,你可以试试这个,但这是不正确的:
Run Code Online (Sandbox Code Playgroud)gpointer p; int i; p = (void*) 42; i = (int) p;同样,该示例不正确,请勿复制.问题是在某些系统上你需要这样做:
Run Code Online (Sandbox Code Playgroud)gpointer p; int i; p = (void*) (long) 42; i = (int) (long) p;
(来源:GLib参考手册GLib 2.39.92,章节类型转换宏).
为什么演员long必要?
是否需要加宽int不作为指针演员的一部分自动发生?
嗯..我很喜欢这样的修饰符,如长/短扩展/减少创建变量时分配的内存量,但是......
#include <stdio.h>
#define test_int int
#define long_int long int
#define long_long_int long long int
void main()
{
printf("%i\n", sizeof (test_int)); //output 4
printf("%i\n", sizeof (long_int)); //output 4. Why? wasn't I modified it's size?
printf("%i\n", sizeof (long_long_int)); //output 8
}
Run Code Online (Sandbox Code Playgroud)
由于未知原因,它将int和long int的大小打印为相同.我使用的是vc ++ 2010 express版.对不起,很难在谷歌找到答案,它总是显示长和int作为单独的类型.
我正在做一个计算彩票概率的程序.规格选择47个中的5个数字和27个中的1个
所以我做了以下事情:
#include <iostream>
long int choose(unsigned n, unsigned k);
long int factorial(unsigned n);
int main(){
using namespace std;
long int regularProb, megaProb;
regularProb = choose(47, 5);
megaProb = choose(27, 1);
cout << "The probability of the correct number is 1 out of " << (regularProb * megaProb) << endl;
return 0;
}
long int choose(unsigned n, unsigned k){
return factorial(n) / (factorial(k) * factorial(n-k));
}
long int factorial(unsigned n){
long int result = 1;
for (int i=2;i<=n;i++) result *= …Run Code Online (Sandbox Code Playgroud) 在C中,64位系统上的long为64位.这是否反映在Python的ctypes模块中?
在64位Debian Linux 6上:
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.maxint
9223372036854775807
>>> sys.maxunicode
1114111
Run Code Online (Sandbox Code Playgroud)
在64位Windows 7上:
Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.maxint
2147483647
>>> sys.maxunicode
65535
Run Code Online (Sandbox Code Playgroud)
两种操作系统都是64位.根据维基百科,他们有sys.maxunicode 在unicode中有1,114,112个代码点.Windows上的sys.maxunicode是错误的吗?
为什么他们有不同的sys.maxint?
我在/usr/include/limits.h中看到了
/* Minimum and maximum values a `signed long int' can hold. */
if __WORDSIZE == 64
define LONG_MAX 9223372036854775807L
else
define LONG_MAX 2147483647L
endif
define LONG_MIN (-LONG_MAX - 1L)
/* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */
if __WORDSIZE == 64
define ULONG_MAX 18446744073709551615UL
else
define ULONG_MAX 4294967295UL
endif
ifdef __USE_ISOC99
/* Minimum and maximum values a `signed long long int' can hold. */
define LLONG_MAX 9223372036854775807LL
define LLONG_MIN (-LLONG_MAX - 1LL)
/* Maximum …Run Code Online (Sandbox Code Playgroud) 我正在处理非常旧的遗留代码,并将其从 32 位移植到 64 位。
我遇到的困难之一是 MFC 序列化。32 位和 64 位之间的区别之一是指针数据的大小。CArray这意味着,例如,如果由于某种原因我序列化了类似的大小
ar << m_array.GetSize();
Run Code Online (Sandbox Code Playgroud)
32 和 64 平台之间的数据不同,因为GetSize返回INT_PTR. 为了使序列化数据与以 32 位和 64 位编译的同一应用程序完全兼容,我在存储阶段强制使用数据类型,在读取时也强制使用相同的数据类型。(非常确定 32 位足以满足此数据)
店铺
ar << (int)m_array.GetSize();
Run Code Online (Sandbox Code Playgroud)
阅读
int iNumSize = 0;
ar >> iNumSize ;
Run Code Online (Sandbox Code Playgroud)
换句话说,应用程序无论是以 32 位还是 64 位编译,都可以像 as 一样序列化这些数据int。
现在我对类型的序列化有一个疑问CArray;CArray使用内置的CArchive序列化来序列化代码
//defined as CArray m_arrayVertex; on .h
m_arrayVertex.Serialize(ar);
Run Code Online (Sandbox Code Playgroud)
这是使用此模板Serialize在 MFC 文件中定义的afxtemp.h
template<class TYPE, class ARG_TYPE>
void CArray<TYPE, ARG_TYPE>::Serialize(CArchive& …Run Code Online (Sandbox Code Playgroud) 在我的任务中,它说"不要添加长int或长长的私有成员来完成这个,因为不能保证任何一个实际上可以存储比int更大的数字." 我知道int的最大值为2 ^ 31-1,long long的最大值为2 ^ 63-1.有人能给我一个例子,为什么给定的句子是真的?
提前致谢!
100,000,000使用以下方法对第一个正整数求和:
import numpy as np
np.arange(1,100000001).sum()
Run Code Online (Sandbox Code Playgroud)
我返回:987459712,它与公式不匹配:N(N+1)/2for N=100000000。即,公式返回5000000050000000。
在发布之前,我写了以下内容,返回True:
np.arange(1,65536).sum() == ((65535+1) * 65535)/2
Run Code Online (Sandbox Code Playgroud)
然而,这个数字65536似乎是一个关键点,因为
np.arange(1,65537).sum() == ((65536+1) * 65536)/2
Run Code Online (Sandbox Code Playgroud)
返回False。
对于大于65536代码的False整数返回,而低于此阈值的整数返回True。
有人可以解释我在计算总和时做错了什么,或者代码发生了什么?
C 能保证sizeof(long) == sizeof(void*)吗?如果不是,为什么它在 Linux 内核源代码中使用得如此广泛?
我看了sizeof(int)==sizeof(void*)?但那是关于sizeof(int)vs 的sizeof(void *)。
c ×4
python ×4
c++ ×3
linux ×3
int ×2
windows ×2
32bit-64bit ×1
64-bit ×1
casting ×1
ctypes ×1
linux-kernel ×1
long-integer ×1
mfc ×1
modifier ×1
networking ×1
numpy ×1
pointers ×1
python-3.x ×1
sockets ×1
sum ×1
unicode ×1
winapi ×1